【问题标题】:why does the parent pid return a different value than getpid()?为什么父 pid 返回的值与 getpid() 不同?
【发布时间】:2018-11-25 16:35:03
【问题描述】:

根据手册页

getpid() 返回调用进程的进程 ID (PID)。

  1. 在以下代码中,为什么 parent pid 返回的值与 getpid() 不同?
  2. 主进程和父进程不一样吗?
  3. 为什么在不同的系统上运行时会得到不同的输出?

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

int main(int argc, char const *argv[])
{

    printf("getpid = %d \n", (int)getpid());

    pid_t pid = fork();
    printf("fork returned %d \n", (int)pid);

    switch (pid)
    {
    case -1:
        perror("fork failed");
        break;

    case 0:
        printf("I am a child  with pid = %d\n", (int)pid);
        break;

    default:
        printf("I am a parent with pid = %d\n", (int)pid);

        break;

    }
    return 0;
}

运行时输出:

getpid = 8208 
fork returned 8209 
I am a parent with pid = 8209
fork returned 0 
I am a child  with pid = 0

在另一台电脑上运行时的输出:

getpid = 2522 
fork returned 2523 
I am a parent with pid = 2522
fork returned 0 
I am a child  with pid = 2523

【问题讨论】:

  • 您必须在fork 之后调用getpid 因为fork 使用new创建了一个new 进程> pid。
  • 要么你的另一台电脑完全坏了,要么你没有运行你认为你正在运行的东西。
  • 想想pid 的值,当你switch 时,登陆case 0 以及是否真的可以是一个pid。
  • 您的另一台 PC 不会从您声称在其上运行的代码生成您声称的输出。将代码从获得正确输出的机器重新复制到没有正确输出的机器上,在第二台机器上重新编译程序,然后运行它(但不要丢失第一个程序——制作备份副本等)。重新编译的代码不太可能产生您声称未重新编译的代码产生的答案。

标签: c unix fork pid


【解决方案1】:

是的,父进程和主进程是一回事。

您的代码的这个 sn-p 应该为您提供有关解决方案的线索:

switch (pid) {
    /* ... */
    case 0:
        printf("I am a child  with pid = %d\n", (int)pid);
        break;

这实际上是说“如果pid 为零,则子 pid 始终为零”。这显然不可能是真的,所以是你对fork()的返回值的解释不正确。

手册页指出:

成功完成后,fork()向子进程返回值0,并将子进程的进程ID返回给父进程。

所以父进程中的变量pid子进程的pid,不是父进程自己的pid。

在子进程中,您需要在fork() 之后调用getpid() 以获取子进程自己的pid。

【讨论】:

    【解决方案2】:

    fork 复制一个进程,在 fork 之后,它们都并行运行。告诉程序是子进程还是父进程,子进程返回0,父进程返回子进程的PID。

    因此,在 fork 之后,您必须在代码中为父级和子级调用 getpid()

        pid_t thispid= getpid(); 
        switch (pid)
        {
        case -1:
            perror("fork failed");
            break;
    
        case 0:
            printf("I am a child  with pid = %d\n", (int)thispid);
            break;
    
        default:
            printf("I am a parent with pid = %d\n", (int)thispid);
            break;
    
        }
    

    【讨论】:

      猜你喜欢
      • 2011-09-28
      • 2012-09-16
      • 2020-12-12
      • 2013-02-17
      • 2018-07-02
      • 1970-01-01
      • 2014-08-23
      • 2014-01-30
      • 1970-01-01
      相关资源
      最近更新 更多