我想使用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 &
来自终端。
答案 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);
当然,在实际程序中,您应该始终检查返回代码。