Operating system fork()系统调用中print语句的序列

Operating system fork()系统调用中print语句的序列,operating-system,fork,computer-science,system-calls,Operating System,Fork,Computer Science,System Calls,为了更好地理解fork()系统调用,我在fork()和print语句之间随机播放,但遇到了这样的代码,代码是 #include<stdio.h> #include<unistd.h> #include<stdlib.h> int main() { printf("\n my process id %d \n",getpid()); pid_t pid1=fork(); printf("\nPID:=%d fork returned %d\n"

为了更好地理解fork()系统调用,我在fork()和print语句之间随机播放,但遇到了这样的代码,代码是

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
   printf("\n my process id %d \n",getpid());
   pid_t pid1=fork();
   printf("\nPID:=%d fork returned %d\n",getpid(),pid1);
   pid_t pid2=fork();
   printf("\nPID:=%d fork returned %d\n",getpid(),pid2);
   pid_t pid3=fork();
   printf("\nPID:=%d fork returned %d\n",getpid(),pid3);
   return 0;
}
#包括
#包括
#包括
int main()
{
printf(“\n我的进程id%d\n”,getpid());
pid_t pid1=fork();
printf(“\nPID:=%d fork返回%d\n”,getpid(),pid1);
pid_t pid2=fork();
printf(“\nPID:=%d fork返回%d\n”,getpid(),pid2);
pid_t pid3=fork();
printf(“\nPID:=%d fork返回%d\n”,getpid(),pid3);
返回0;
}
以下是获得的输出-:

我无法获得它所遵循的打印序列。唯一得到的是,首先执行PID为5079的进程,对于所有fork()系统调用,它将子PID返回到父进程。我没有获得进一步的序列。

fork()一开始可能看起来有点混乱,但实际上非常简单。它所做的是将当前进程复制到另一个内存位置的新进程中(复制所有内容、数据、代码、当前指令等)

因此,我们从一个pid=5079的进程开始,当我们到达fork调用时,创建了一个pid=5080的子进程,它具有与父进程相同的代码

 // Parent Process //                    // Child Process //
 #include<stdio.h>                       #include<stdio.h> 
 #include<unistd.h>                      #include<unistd.h>
 #include<stdlib.h>                      #include<stdlib.h>
 int main()                              int main()
 {                                       {
    printf("\...                            printf("\...
    pid_t pid1=fork();                      pid_t pid1=fork(); 
    printf("\nPI...    //Next line//        printf("\nPI...    //Next line//
    pid_t pid2=fork();                      pid_t pid2=fork();
    printf("\nPID:=...                      printf("\nPID:=...
    pid_t pid3=fork();                      pid_t pid3=fork();
    printf("\nPID:=...                      printf("\nPID:=...
    return 0;                               return 0;
 }                                        }
为什么这是剩下的代码?在其他进程中由fork创建的任何进程都将在fork语句之后开始执行,就像我们前面看到的那样。因此,进程5082打印行5随后终止(它的值pid3=0,因为它是5079的子进程)。在终止5082之后,5081占用CPU,并打印第6行,然后创建进程5085,如第6行所示(为什么不按顺序创建5083?可能是操作系统在代码执行期间创建了一些进程)

在打印行6之后,处理5081终止。现在我们的内存中有5080和5085。您现在应该能够按照模式运行了,选择5080运行,创建5086和5087,然后终止。然后5085运行,接着是5087,最后只有print语句,两个语句都终止了,剩下的5086进行了打印,最后一个fork创建了5088,然后像5088打印后一样终止

操作系统是一个迷人的领域,它的乐趣超越了系统调用,如果你对这本书感兴趣,我推荐这本书,这是我在大学学习的内容:

你知道叉子是干什么的吗?它是如何工作的?它的回报值是多少?看来你只是在没有真正思考的情况下使用了它。一旦产生了一个新进程,就不能保证谁先运行。所以你可以期待任何输出。接下来由您决定:看看fork()sys调用返回值是什么。
  // process 5082 //      // process 5081 //     // process 5080 //
  printf("\nP...          printf("\nP...         printf("\nP...
  return 0;               pid_t pid3=fork();     pid_t pid2=fork();
                          printf("\nP...         printf("\nP...
                          return 0;              pid_t pid3=fork();
                                                 printf("\nP...
                                                 return 0;