如果我写这个怎么办? 我执行了两个printf语句!!
#include<stdio.h>
#include<stdlib.h>
int main(void){
if(fork())
printf("entering IF");
else
printf("entering ELSE");
return 0;
}
答案 0 :(得分:3)
你到底在问什么?
fork()
复制调用进程,返回父进程中的子进程'PID,子进程中返回0。
在C中,if
将任何非零值计算为true,这意味着将从父线程打印entering IF
,并从子线程打印entering ELSE
。
应该注意的是,它们的打印顺序是不确定的,因此您可能会在entering ELSE
之前看到entering IF
。
请参阅:man(2) fork
答案 1 :(得分:0)
根据手册页的fork
系统调用返回值是
回报价值成功时,子进程的PID在父进程中返回,0为 孩子回来了。失败时,在父项中返回-1,不创建子进程,并正确设置errno。
因此,if
语句由parent
进程执行,而else
进程执行child
的位置。
答案 2 :(得分:0)
fork()
通过复制调用进程来创建子进程。调用fork()
的流程是父流程,新创建的流程是子流程。因此fork()
将进程拆分为两个,并将0
返回到子进程,将子进程的PID返回到父进程,如果fork失败,则返回-1
。
在您的计划中:
if(fork())
printf("entering IF");
else
printf("entering ELSE");
父进程将打印entering IF
,子进程将打印entering ELSE
。
子进程和父进程分别运行。因此,您无法确定哪个进程首先获取计划,但有多种方法可以同步它们。对于例如让父进程等到子进行完毕,检查this。
其他强>:
Linux内核(2.6.23及更高版本)提供了一个可调参数 - sched_child_runs_first
来自this:
/ proc / sys / kernel / sched_child_runs_first(自Linux 2.6.23起)
如果此文件包含值零,则在fork(2)之后, 父级首先安排在CPU上。如果文件是 tains非零值,然后孩子先安排 CPU。 (当然,在多处理器系统上,父级 并且可以立即在CPU上安排孩子。)