2

所以我有以下C代码:

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

int main(){
    int i = 0, n;
    n = 5;
    pid_t pid;
    printf("i=%d Right before the loop\n", i, getpid(), getppid());
    for (i = 0; i < n; i++){
        pid = fork();
        if (pid <= 0){
            printf("something happens in loop #%d. pid = %d\n", i, pid);
            break;
        }
        printf("End of loop #%d\n", i);
    }

    printf("i=%d My process ID = %d and my parent's ID = %d\n", i, getpid(), getppid());

    return 0;
}

我只有一个问题:为什么

printf("i=%d My process ID = %d and my parent's ID = %d\n", i, getpid(), getppid());

像在循环内一样被执行多次?我试图通过很多方法弄清楚,但我找不到原因。

4

2 回答 2

6

原因是fork()通过创建一个子进程来工作,该子进程是在fork()调用时开始运行的父进程的副本。因此,每个子进程都运行该printf命令。

例子:

这是一个不太复杂的例子:

#include <stdio.h>

int main(){
  int pid = fork();

  if (pid == 0){
    // child code    
    printf("child pid: 0\n");

  }else{
    // parent code
    printf("parent pid: %d\n", pid);
  }

  // executed by both
  printf("This text brought to you by process %d.\n", pid);
}

如果您想限制某些代码只能由孩子或父母运行,您必须执行类似的操作。

在我的机器上,当我刚刚运行它时,它会输出:

parent pid: 12513
This text brought to you by process 12513.
child pid: 0
This text brought to you by process 0.

我的操作系统首先运行父进程,但不是必须的。

于 2013-09-20T01:45:15.900 回答
1

如果你不知道fork()和使用它,它是危险的。

这是 Linux 中用于创建新进程的基本系统调用之一。请参阅手册页以了解它的作用。这是一个有用的链接,可让您更好地理解。叉子()。要了解更多信息,您还可以参考此处-fork () wiki。它使用写时复制等方法并与孩子共享资源。

一旦您习惯fork()了创建新进程,您就可以使用它exec(...)来更改该进程正在执行的程序。在阅读了它们中的每一个之后,您可以参考这篇文章。

于 2013-09-20T02:08:40.237 回答