我有这个c ++程序正在对指定的ip地址执行简单的ping操作。我没有进入网络,所以我只是在c ++中使用system()命令从shell执行ping并将结果存储在一个文件中,这很容易。
问题是我想在执行system()命令时在屏幕上打印一些点。我试过:
while(system(cmd))
{
//execute the task here
}
但没有成功。我认为我应该创建线程或其他东西。
你能帮帮我吗?究竟我该怎么做才能按照我的意愿完成这项工作?答案 0 :(得分:8)
system
的问题在于它暂停执行直到完成。在unix系统上,您需要使用一系列fork,execv,dup2和pipe。这将允许您做一些更有用的事情。有关示例,请参阅http://docs.linux.cz/programming/c/unix_examples/execill.html。
答案 1 :(得分:5)
您需要使用fork
创建一个分叉进程,并使用popen
从命令ping google.com
的输出中读取输入并相应地处理它。 Beej有一个有趣的guide来理解IPC机制,它包含在下面的代码示例中......
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> int main(void) { pid_t pid; int rv; FILE *ping; char buf[2000]; switch(pid = fork()) { case -1: perror("fork"); /* something went wrong */ exit(1); /* parent exits */ case 0: // We're the child ping = popen("ping google.com", "r"); if (ping != NULL){ fgets(buf, sizeof(buf), ping); pclose(ping); rv = 0; }else{ perror("popen failed"); rv = -1; } exit(rv); default: // We're the parent... wait(&rv); } // Now process the buffer return 0; }
希望这有帮助, 最好的祝福, 汤姆。
答案 2 :(得分:2)
编辑经过深思熟虑,我相信popen是cmd
输出或不输出的方式。
<强>旧版强>
您可能正在寻找wait (2)
系列命令以及fork和exec中的内容。
从手册页
wait()函数暂停执行其调用进程,直到 stat_loc信息可用于已终止的子进程或a 收到信号。从成功的wait()调用返回时, stat_loc区域包含有关进程的终止信息 退出如下定义。
或者cmd
是否会返回您想要的一些进度信息popen (3)
,这些信息会在一些现有的SO问题中讨论;例如How can I run an external program from C and parse its output?。
答案 3 :(得分:1)
如果您使用的是unix系统,则可以使用&amp;表明它在后台运行如下:myscript&amp;
这将启动与当前程序分开的新进程。您需要获取进程号(希望来自系统,我的c posix api知识生锈)然后检查它可能是通过调用wait或waitpid等非阻塞打开的。
这对于初学者来说很复杂 - 如果仍有兴趣,我会让其他人发布详细信息。