赞
踩
fork()使用详解
摘自:https://blog.csdn.net/u014082714/article/details/45031771
一、fork入门知识
进程的定义:
进程是一个执行中的程序的实例,是系统进行资源分配和调度的一个独立单位。
PCB是进程存在的唯一标识。PCB应常驻内存,不管在linux还是windows中都有专门区域存储每个进程的PCB。
进程的创建:
子进程可以继承父进程所拥有的所有资源,当子进程被撤销时,应将其从父进程那里获得的所有资源归还给父进程,在撤销父进时,也必须同时撤销其所有子进程。
进程的同步:
进程同步的主要任务是对多个相关进程早执行次序上进行协调,以使并发执行的诸进程之间能有效的共享资源和相互合作,从而使程序的执行具有可再现性。
一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。
一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。
我们来看一个例子:
点击(此处)折叠或打开
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
/*
* @brief main For the understanding of the fork()
*
* @param argc
* @param argv[]
*
* @return 在父进程中返回子进程的进程号;在子进程中返回0。
*/
int main(int argc, char *argv[])
{
pid_t pid;
int cnt = 0;
pid = fork();
if (pid == -1) {
perror("fork error");
exit(1);
} else if (pid == 0) {
printf("The returned value is %d\nIn child process!!\nMy PID is %d\n",
pid, getpid());
cnt++;
} else {
printf("The returned value is %d\nIn father process!!\nMy PID is %d\n",
pid, getpid());
cnt++;
}
printf("cnt = %d\n", cnt);
return 0;
}
运行结果是:
The returned value is 20473
In father process!!
My PID is 20472
cnt = 1
The returned value is 0
In child process!!
My PID is 20473
cnt = 1
在语句pid=fork()之前,只有一个进程在执行这段代码,但在这条语句之后,就变成两个进程在执行了,这两个进程的几乎完全相同,将要执行的下一条语句都是if(pid == -1)……
为什么两个进程的pid不同呢,这与fork函数的特性有关。fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
1)在父进程中,fork返回新创建子进程的进程ID;
2)在子进程中,fork返回0;
3)如果出现错误,fork返回-1;
在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。