【问题标题】:saving the returnin value of fork in a variable in C [duplicate]将fork的返回值保存在C中的变量中[重复]
【发布时间】:2017-09-16 19:00:32
【问题描述】:

我对函数 fork 返回的值有点困惑。我知道值0 是为child 进程和值>0 是为parent 进程。 我有下面的代码

int main()   
{    
   int pid;
   pid = fork();
   if(pid == 0)
       //DO SOMETHING
   else
       //DO SOMETHING ELSE 
   return 0;
}

fork 后的有效pid 对于每个进程都不同吗? 我不明白它是如何转换价值的。我还有第二部分的代码

int main()
{
    int pid;
    if (pid == 0)
    {
          return 5;
    }
    printf("parent = %d waits for child = %d ", getpid(), pid);
    waitpid(pid, NULL, 0);
    printf("child terminates!")
    return 0;
}

其中我不明白为什么 pid 与第一个 printf 一致具有 child 的值。不应该是父级的id?

【问题讨论】:

    标签: c fork


    【解决方案1】:

    每个进程fork后的有效pid不一样?

    是的,这是您作为返回值获得的新进程 ID。不能同时存在具有相同 ID 的相同进程,因此无论何时分叉,通常都会得到一个唯一的进程。

    进程在fork() 调用中被克隆,包括所有可变内存内容(堆、堆栈、数据段)的副本。复制完成后,内核会继续执行这两个进程,但会给出不同的返回值。

    其中我无法理解为什么 pid 与 first printf 一致的值为 child。不应该是父母的id吧?

    getpid() 返回父级的 ID,因为这是您现在执行它的上下文。 pid 在该示例中只是垃圾(未初始化的内存),因此无论您认为自己看到了什么,它都不是进程 ID,而只是一些随机内存内容。

    【讨论】:

    • 在第二个问题中,您说pid 它不是进程ID。但是父进程使用 waitpid() 来等待子进程并等待。那么为什么它不是进程 ID 呢?
    • @DimitrisMpl 这是一个堆栈分配的整数变量,根本没有初始化。尽管名称相同,但它与您在其他函数中使用的 pid 变量不同。所以它只包含上次写入该位置堆栈的任何内容。
    猜你喜欢
    • 2021-07-01
    • 1970-01-01
    • 2020-09-13
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    相关资源
    最近更新 更多