Operating system fork()系统调用中print语句的序列
为了更好地理解fork()系统调用,我在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"
#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;