我正在分叉,并在子进程中执行某个块。我的问题是我的子进程永远不会进入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){}
。该块中的代码永远不会执行。
答案 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存在问题。 我感谢所有的帮助。