Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么不是';这句话行得通吗?_C_If Statement_Fork_Pid - Fatal编程技术网

C 为什么不是';这句话行得通吗?

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语句。为什么会这样

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”);
我编辑了顶部的代码,并按照您的建议添加了一些调试行。输出列在代码下面,仍然不工作。