关于fork()的学习
Posted helloworldcode
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于fork()的学习相关的知识,希望对你有一定的参考价值。
返回类型
pit_t是Linux下的进程号类型,也就是Process ID _ Type 的缩写。 在宏定义中是unsigned int类型。
fork()的返回值
负数:如果出错,则fork()返回-1,此时没有创建新的进程。最初的进程仍然运行。
零 :在子进程中,fork()返回0。
正数:在父进程中,fork()返回正的子进程的PID。
相关测试
#include<stdio.h> #include<iostream> using namespace std; #include <unistd.h>; #include <sys/types.h>; main () { pid_t pid; pid=fork(); if (pid < 0) printf("error in fork!"); else if (pid == 0){ printf("I am the child process, my process id is %d ",getpid()); } else{ printf("I am the parent process, my process id is %d ",getpid()); exit(0); //父进程退出 } printf("子进程仍然在运行中......"); }
测试结果
am the parent process, my process id is 26575
I am the child process, my process id is 26583
子进程仍然在运行中......
按 <RETURN> 来关闭窗口...
测试说明
操作系统创建一个新的进程(子进程),并且在进程表中相应为它建立一个新的表项。新进程和原有进程的可执行程序是同一个程序;上下文和数据,绝大部分就是原进程(父进程)的拷贝,但它们是两个相互独立的进程!父进程继续执行,操作系统对fork的实现,使这个调用在父进程中返回刚刚创建的子进程的pid(一个正整数),子进程在之后的某个时候得到调度,它的上下文被换入,占据 CPU,操作系统对fork的实现,使得子进程中fork调用返回0。所以在这个进程(注意这不是父进程了哦,虽然是同一个程序,但是这是同一个程序的另外一次执行,在操作系统中这次执行是由另外一个进程表示的,从执行的角度说和父进程相互独立)中pid=0。
为什么看上去程序中互斥的两个分支都被执行了?在一个程序的一次执行中,这当然是不可能的;但是你看到的两行输出是来自两个进程,这两个进程来自同一个程序两次执行的结果。
以上是关于关于fork()的学习的主要内容,如果未能解决你的问题,请参考以下文章
github 修改fork的代码之后如何提交代码并pull request