执行system()命令时执行其他任务

时间:2010-02-13 20:17:48

标签: c++ linux system

我有这个c ++程序正在对指定的ip地址执行简单的ping操作。我没有进入网络,所以我只是在c ++中使用system()命令从shell执行ping并将结果存储在一个文件中,这很容易。

问题是我想在执行system()命令时在屏幕上打印一些点。我试过:

while(system(cmd))
{ 
//execute the task here
}

但没有成功。我认为我应该创建线程或其他东西。

你能帮帮我吗?究竟我该怎么做才能按照我的意愿完成这项工作?

4 个答案:

答案 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等非阻塞打开的。

这对于初学者来说很复杂 - 如果仍有兴趣,我会让其他人发布详细信息。