execv()命令挂起在C shell中

execv()命令挂起在C shell中,c,shell,unix,fork,execv,C,Shell,Unix,Fork,Execv,我正在使用C shell,当我运行/bin/ls时,它会正确地显示它,但会挂起后缀。下面是与我相关的代码,我觉得它与父案例中缺少wait()语句有关 for(p = j->first_process; p; p = p->next) { if (!strcmp(p->argv[0], "exit" )) exit(0); switch (pid = fork()) { case -1: /* fork fail

我正在使用C shell,当我运行
/bin/ls
时,它会正确地显示它,但会挂起后缀。下面是与我相关的代码,我觉得它与父案例中缺少wait()语句有关

for(p = j->first_process; p; p = p->next) {
        if (!strcmp(p->argv[0], "exit" )) exit(0);     

        switch (pid = fork()) {

           case -1: /* fork failure */
            perror("fork");
            exit(EXIT_FAILURE);

           case 0: /* child */

               /* establish a new process group, and put the child in
            * foreground if requested
            */
            if (j->pgid < 0) /* init sets -ve to a new process */
                j->pgid = getpid();
            p->pid = 0;

            if (!setpgid(0,j->pgid))
                if(fg) // If success and fg is set
                     tcsetpgrp(shell_terminal, j->pgid); // assign the terminal

            /* Set the handling for job control signals back to the default. */
            signal(SIGTTOU, SIG_DFL);

            /* execute the command through exec_ call */
            execv(p->argv[0], p->argv);
            exit(0);

           default: /* parent */
            /* establish child process group here to avoid race
            * conditions. */
            p->pid = pid;
            if (j->pgid <= 0)
                j->pgid = pid;
            setpgid(pid, j->pgid);
        }

        /* Reset file IOs if necessary */

        if(fg){
            /* Wait for the job to complete */
        }
        else {
            /* Background job */
        }
    }
}
for(p=j->first_进程;p;p=p->next){
如果(!strcmp(p->argv[0],“exit”))退出(0);
开关(pid=fork()){
案例-1:/*分叉故障*/
佩罗尔(“福克”);
退出(退出失败);
案例0:/*儿童*/
/*建立一个新的进程组,并将子进程放入
*前台,如有要求
*/
如果(j->pgid<0)/*init将-ve设置为新进程*/
j->pgid=getpid();
p->pid=0;
如果(!setpgid(0,j->pgid))
if(fg)//如果设置了success和fg
tcsetpgrp(shell_终端,j->pgid);//分配终端
/*将作业控制信号的处理设置回默认值*/
信号(SIGTTOU、SIG_DFL);
/*通过exec_uu调用执行命令*/
execv(p->argv[0],p->argv);
出口(0);
默认值:/*父级*/
/*在此处建立子进程组以避免竞争
*条件*/
p->pid=pid;
如果(j->pgid pgid=pid;
setpgid(pid,j->pgid);
}
/*如有必要,重置文件IOs*/
如果(前景){
/*等待作业完成*/
}
否则{
/*背景工作*/
}
}
}

等待的调用可能发生在其他地方?您是否尝试在调试器“挂起”时附加调试器以查看挂起的位置?您最终不应该
在子
execv()
之后退出(0)
(表示成功)(这必然意味着execv失败)例如,.bash使用退出代码126和127来传递命令执行中的某些错误……对
wait
的调用可能发生在其他地方?您是否尝试在调试器“挂起”时附加调试器以查看其挂起的位置?您最终不应该在子
execv()之后退出(0)
(表示成功)
例如,bash使用退出代码126和127来传递命令执行中的某些错误。。。