使用execvp在后台运行进程

时间:2013-11-07 19:55:09

标签: c

我想使用fork和execvp在后台运行一个子进程,我看到很多相同的问题,但由于某些原因,它们都没有真正在后台运行。 当我的意思是我希望程序在后台运行我的意思是我根本不想看到它。目前我有一个名为e_print的程序,每1秒打印一次输出,我想保持运行但看不到输出(实际上是在后台运行) 在这里我的代码:

        if((son = fork())==0){//son process
        i = execvp(tokens_set[0],tokens_set);//tokens set was previously set
        if(i == (-1)){
            perror("couldn't find the command: ");
        }
        exit(0);

    }else{ // father process
        printf("father proccess goes on\n");
    }

出于某种原因,我看到的所有指南和问题都称它在后台运行,但看到了孩子的输出。

我想保持父亲运行,说要求用户提供另一个输入,同时我希望e_print进程运行。 同如:

./e_print &

来自终端。

3 个答案:

答案 0 :(得分:0)

您可以尝试并守护子进程。不确定这是不是你想要的。

答案 1 :(得分:0)

它与实际的fork或execvp调用没有任何关系,它与你如何等待它们有关。

对于前台进程,就像我假设你一直处理的那样,你将分叉新进程,用exec运行程序,然后用wait()或waitpid()等待父进程中的子进程。如果进程是前景或后台,则仅取决于您等待孩子的位置和方式。您还可以安装信号处理程序以与子项进行通信

答案 2 :(得分:0)

如果您唯一关心的是输出,那么您所做的就是关闭并重新打开子程序的标准输出到/ dev / null。

在调用execvp之前的“son”进程中,执行:

close(0);
close(1);
close(2);
open("/dev/null", O_RDONLY);
open("/dev/null", O_WRONLY);
open("/dev/null", O_WRONLY);

当然,在实际程序中,您应该始终检查返回代码。