一个进程,包括代码、数据和分配给进程的资源。
fork ()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。
一个进程调用 fork ()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。
用户数据一样,进程 ID 不一致。
1.fork 函数的返回值
2. 子进程创建成功之后,子进程的执行位置
3. 父子进程的执行顺序 不一定
4. 如何区分父子进程
2.getpid/getppid 函数
getpid: 得到当前进程的 PID
getppid: 得到当前进程的父进程的 PID
#include <sys/types.h>
#include <unistd.h>
#include<stdio.h>int main()
{pid_t pid;//定义fork()函数的返回类型pid_t
pid = fork();
if (pid>0)//返回值pid大于0,则为父进程
{
printf("this is father process %d",getpid());}
else if(pid==0)//返回值pid等于0,则为子进程
{printf("this is son process %d,father process is%d",getpid(),getppid());}
return 0;
}
父子进程间的数据共享
fork 之后两个地址空间区数据完全相同
后续各自进行了不同的操作
父进程: num+400
子进程: num+200
物理地址: i, f_num,s_num
各个进程的地址空间中的数据是完全独立的
对于同一个变量,读时共享
写的时候分别在物理地址上拷贝一份变量进行单独读写
父子进程之间可不可以通过全局变量通信?
不能,两个进程内存不能共享
#include <sys/types.h>
#include <unistd.h>
#include<stdio.h>
int i=200;
int main()
{pid_t pid;
pid = fork();
if (pid>0)
{
i+=400;
printf("this is father process %d\n",getpid());printf("i=%d\n",i);
}
else if(pid==0)
{
i+=200;
printf("this is son process %d,ppid is%d\n",getpid(),getppid());
printf("i=%d\n",i);
}for(int i=0;i<3;i++)
{printf("------i=%d\n",i);
}
return 0;
}