这是相关的代码片段:
if(!strcmp(args[0],"run")){
pid_t pid = fork();
if(pid == 0){
execvp(args[1], args);
fprintf(stdout, "Process could not be found in this directory\n");
kill((int)getpid(), SIGKILL);
}
else{
if(pid < 0)
exit(1);
fprintf(stdout, "PID of Process = %d\n", pid);
int success = waitpid(pid, &childExitStatus, WUNTRACED | WCONTINUED);
if(success == -1)
exit(EXIT_FAILURE);
}
}
现在当我运行像Libre Office数学这样的过程时,它只会打开它的一个实例。但是,当我尝试使用此代码打开xterm时,它将继续执行一遍又一遍,在我执行中断并退出之前创建了许多xterm实例。我没有看到任何会导致这种情况发生的循环。对此为何会有所了解?
答案 0 :(得分:2)
execvp()
调用不正确,因为它在开始时传递了另一个参数“run”。以这种方式执行xterm
时,效果类似于xterm xterm
,并且xterm使用xterm
作为shell。新的xterm继承了一个SHELL
环境变量,导致它启动另一个xterm,直到限制用完为止。
答案 1 :(得分:0)
除了jilles&#39;回答你的直接问题,你应该知道如果fprintf
失败,调用execvp
是不明智的,因为它可能导致重复先前缓冲的输出。这也意味着你无法安全地使用vfork
,这仍然是一个有价值的优化(特别是如果父进程使用大量内存)。
遗憾的是,没有良好的方式报告exec
失败。我倾向于做
if (pid == 0) {
execvp(...);
/* if we got here, something bad happened */
_exit(127);
}