C 两个条件如何在if-if-else语句中工作?

C 两个条件如何在if-if-else语句中工作?,c,if-statement,C,If Statement,我的教授用C语言展示了以下示例: #include <sys/types.h> #include <stdio.h> #include <unistd.h> int main() { pid_t pid; /* fork another process */ pid = fork(); if (pid < 0) { /* error occurred */ fprintf(stderr, "Fork Fail

我的教授用C语言展示了以下示例:

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>

int main() {
   pid_t pid;

   /* fork another process */
   pid = fork();
   if (pid < 0) { /* error occurred */
         fprintf(stderr, "Fork Failed");
         return 1;
   }
   else if (pid == 0) { /* child process */
         execlp("/bin/ls", "ls", NULL);
   }
   else { /* parent process */
        /* parent will wait for the child */
        wait (NULL);
        printf("Child Completed its execution\n");
   }

return 0;
}
#包括
#包括
#包括
int main(){
pid_t pid;
/*叉另一个过程*/
pid=fork();
如果(pid<0){/*发生错误*/
fprintf(标准“Fork Failed”);
返回1;
}
如果(pid==0){/*子进程*/
execlp(“/bin/ls”,“ls”,NULL);
}
else{/*父进程*/
/*家长将等待孩子*/
等待(空);
printf(“子项已完成其执行\n”);
}
返回0;
}
我编译并运行了它。我在这段代码中看到了一个奇怪的行为:

“ls”程序/命令的结果在else if条件下打印,但字符串“Child Completed it execution\n”也在else中打印


这不是一种奇怪的行为吗?

不,是你干的。有两个进程正在运行。一个报告了ls,另一个报告了printf()


具体来说,子/分叉进程执行/bin/ls,父进程名为printf(),即您看到的输出

这是因为
fork
创建一个子进程,该子进程从代码中的同一点继续执行,但
pid
设置为0。您看到的是父进程正在执行
printf
行,而子进程正在执行
ls
命令。

您的意思是子进程检查else if的条件,并且在子进程一侧它是真的吗。父级也会检查相同的条件,但在其一侧为false,然后会陷入“else”?所以我有两个进程使用if语句和指令?是的,每个进程(父进程)和fork都在执行相同的代码。子进程(调用fork()时创建的子进程)的pid为零,因此该条件为真。父级的pid为XXXX(>0),因此满足最后一个条件。我在返回0之前放置了一个printf语句,但它执行了一次。分叉何时在我的代码中终止?execlp是否终止了子进程?我不知道-如果您放置了一个final printf(),它应该由子进程和父进程执行…
execlp
将进程的代码替换为另一个可执行文件(在本例中为
ls
),并且永远不会返回,因此,孩子永远不会看到
printf
。当你看到一个你不知道的函数时,一定要查看手册!那里没有黑魔法。看一眼那边,你就会明白:)