为什么这个if语句不起作用?

时间:2014-03-18 06:23:25

标签: 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)
                {
                    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

当你fork时,子进程收到一个0的PID,对吗?

我的问题出在if(pid == 0){}。该块中的代码永远不会执行。

3 个答案:

答案 0 :(得分:0)

由于if系统调用,您的子进程无法进入wait()

系统调用wait()阻止调用进程,直到其子进程之一退出或接收到信号.wait()获取整数变量的地址并返回已完成进程的进程ID。一些指示子进程完成状态的标志将使用整数指针传回。 wait()的主要目的之一是等待子进程的完成。

执行wait()可能有两种可能的情况。

  • 如果在调用wait()时至少有一个子进程在运行,则调用者将被阻塞,直到其子进程之一退出。此时,呼叫者恢复执行。

  • 如果在调用wait()时没有运行子进程,则此wait()根本不起作用。也就是说,就好像没有wait()那样。

因此请删除wait()系统调用。你的程序运行正常。

答案 1 :(得分:0)

检查代码中的execvp调用,这可能有错误。您可以检查等待获取子pid的返回值或-1。

答案 2 :(得分:0)

道歉。事实证明我的问题是

fprintf(stderr, "the name of our file is %s\n", subargs[i+1]);

我还以为该块从未执行过,因为这不会打印任何东西。 事实证明,subargs存在问题。 我感谢所有的帮助。

相关问题