execv()命令挂起在C shell中
我正在使用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
/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来传递命令执行中的某些错误。。。