在C语言中为linux编写shell,exec用于某个特定进程是无限循环的

时间:2014-01-31 17:17:40

标签: c linux shell exec fork

这是相关的代码片段:

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实例。我没有看到任何会导致这种情况发生的循环。对此为何会有所了解?

2 个答案:

答案 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);
}