使用c在linux中调用fork系统

时间:2018-02-06 06:33:50

标签: c

如果我写这个怎么办? 我执行了两个printf语句!!

enter image description here

#include<stdio.h>
#include<stdlib.h>

int main(void){

    if(fork())
        printf("entering IF");
    else
        printf("entering ELSE");

    return 0;
}

3 个答案:

答案 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上安排孩子。)