[阿里巴巴2015研发工程师B] fork与进程创建

以下程序共创建几个进程:_

int main(){
  fork
()||fork();
}

A.1
B.2
C.3
D.4
E.5
F.6

感谢您为本话题评分。
共有3个回答
  • 0
    Gonn - 2014-09-29 不喜欢

    这道题主要考了两个知识点,一是逻辑运算符,二是对fork的理解。

    fork()系统调用是Unix下以自身进程创建子进程的系统调用,一次调用,两次返回,如果返回是0,则是子进程,如果返回值>0,则是父进程(返回值是子进程的pid)。
    还有在fork()的调用处,整个父进程空间会原模原样地复制到子进程中,包括指令,变量值,程序调用栈,环境变量,缓冲区,等等。

    作弊一下,现在Linux下执行:

    [root@Nowamagic ~]# cat test.c
    #include <stdio.h>
    #include <unistd.h>
    int main()
    {
        fork
    () || fork();
        printf
    ("+\n");
       
    return 0;
    }
    [root@Nowamagic ~]# gcc test.c
    [root@Nowamagic ~]# ./a.out
    +
    +
    +

    输出3次。就是fork父进程返回pid,子进程返回0,返回0后会继续调用下一个fork,再创建一个进程,所以3个。

  • 0
    Gonn - 2014-09-29 不喜欢

    可能讲得不太清楚,再补充下:

    第一个fork:ret > 0,产生父进程。ret = 0,产生子进程1。
    第二个fork(子进程1):ret > 0,产生父进程,也就是本身(子进程1)。ret = 0,产生子进程2。

    所以一共3个进程。具体可以编译一下感受下。

  • 0
    HeartRiver - 2016-06-16 不喜欢

    不是返回0为子进程,而是子进程中返回0;
    程序运行到 fock()||fock();
    父进程调用左fock()产生新的进程,返回子进程id,大于0,右fock()不再执行;
    子进程代码 0||fock;左为0,执行右fock();产生新的子进程,代码 0||0;

    主要理解:
    1.||运算符,由左至右执行,返回true,不再执行右侧代码;
    2.fock()的一次调用两次返回,即仅在当前进程中调用并返回产生子进程的ID,子进程中直接返回0;

以下是预览效果,请确认排版好了再点回复。
如果你认为此话题有广告、灌水的嫌疑,请给此话题评一颗星。平均分低的话题将不会再显示。
良好的讨论氛围由大家共同维护。