C 为什么不是';这句话行得通吗?
我正在分叉,并在子进程中执行某个块。我的问题是我的子进程从未进入if语句。为什么会这样C 为什么不是';这句话行得通吗?,c,if-statement,fork,pid,C,If Statement,Fork,Pid,我正在分叉,并在子进程中执行某个块。我的问题是我的子进程从未进入if语句。为什么会这样 if((x = strcmp(subargs[next_redirect], ">")) == 0) { pid = fork(); fprintf(stderr, "my PID is %i\n", pid); if(pid == 0) {
if((x = strcmp(subargs[next_redirect], ">")) == 0)
{
pid = fork();
fprintf(stderr, "my PID is %i\n", pid);
if(pid == 0)
{
fprintf(stderr, "the name of our file is %s\n", subargs[i+1]);
fp = creat(subargs[i+1], S_IWUSR | S_IRUSR);
dup2(fp, STDOUT_FILENO);
close(fp);
//create sub-command
makesubcommand(subcommand, subargs, last_redirect + 1, i);
execvp(subcommand[0], subcommand);
}
last_redirect = i;
next_redirect = getnextredirect(subargs, i+2, subargc);
}
我的输出是
my PID is 11080
my PID is 0
分叉时,子进程接收到PID为0,对吗
我的问题是在
如果(pid==0){}
。该块中的代码永远不会执行。由于wait()
系统调用,您的子进程无法访问if
系统调用wait()会阻止调用进程,直到其子进程退出或收到信号为止。wait()获取整数变量的地址并返回已完成进程的进程ID。指示子进程完成状态的一些标志将与整数指针一起传回。wait()的主要用途之一是等待子进程的完成
wait()的执行可能有两种情况
- 如果在调用wait()时至少有一个子进程正在运行,则调用方将被阻止,直到其一个子进程退出。此时,调用方继续执行
- 如果在调用wait()时没有子进程运行,则此wait()完全无效。也就是说,好像没有wait()存在
因此,删除
wait()
系统调用。您的程序将正常运行。检查代码中的execvp调用,它可能有错误。您可以检查wait的返回值以获取子pid或-1。抱歉。原来我的问题是
fprintf(stderr, "the name of our file is %s\n", subargs[i+1]);
我一直认为块从未被执行过,因为它不会打印任何东西。
结果表明,斯巴格有一个问题。
非常感谢您的帮助。您将字符串与charecter进行比较…“>”检查一下…分叉后您正在等待,为什么?@vinod:我很好地到达了分叉处。我的问题不在于strcmp。你的孩子大多没有走出
wait(0)代码>在回答过程中间对问题进行显著修改并不是一个好主意,因为它会使某些答案不可理解。<代码> WAITE()/<代码>是在<代码> > 之后。我仍然无法进入if语句。分叉后,您可以尝试打印pid,也可以尝试以这种方式使用pid。查看它是否解析..int child\u id;printf(“我在程序中!\n”);child_id=fork();if(child_id){printf(“我是父母,快要死了。再见!\n”);}else{printf(“我是孩子,快要死了。再见!\n”);
我编辑了顶部的代码,并按照您的建议添加了一些调试行。输出列在代码下面,仍然不工作。