linux中fork函数的一个小思考
2016-06-20 23:45
232 查看
1、fork函数
头文件:
#include<unistd.h>
函数原型:pid_t fork( void);(pid_t 是一个宏定义,其实质是int 被定义在#include<sys/types.h>中)返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1
函数说明:一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。
子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。
LINUX将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间。创建新进程成功后,系统中出现两个基本完全相同的进程,这两个进程执行没有固定的先后顺序,哪个进程先执行要看系统的进程调度策略。
为什么fork返回值有两个:
其实就相当于链表,进程形成了链表,父进程的fork函数返回的值指向子进程的进程id, 因为子进程没有子进程,所以其fork函数返回的值为0.
举个神奇的例子:
分析过程:
每一个进程都会printf一句相应的语句,一共产生了3个新的子进程,父进程重复打印1次,子进程重复打印一次,所以一共是打印了6句话。
本文出自 “momo就是辣么萌” 博客,请务必保留此出处http://momo462.blog.51cto.com/10138434/1791207
头文件:
#include<unistd.h>
函数原型:pid_t fork( void);(pid_t 是一个宏定义,其实质是int 被定义在#include<sys/types.h>中)返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1
函数说明:一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。
子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。
LINUX将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间。创建新进程成功后,系统中出现两个基本完全相同的进程,这两个进程执行没有固定的先后顺序,哪个进程先执行要看系统的进程调度策略。
为什么fork返回值有两个:
其实就相当于链表,进程形成了链表,父进程的fork函数返回的值指向子进程的进程id, 因为子进程没有子进程,所以其fork函数返回的值为0.
举个神奇的例子:
#include <stdio.h> #include <unistd.h> #include <sys/types.h> int main() { int i=0; for(i;i<2;i++) { pid_t id = fork(); if(id==0) { printf("i=%d,child,pid=%d,father,pid=%d,id=%d\n",i,getpid(),getppid(),id); } else { printf("i=%d,father,pid=%d,grandfather,pid=%d,id=%d\n",i,getpid(),getppid(),id); sleep(1); } } return 0; }输入结果:
分析过程:
每一个进程都会printf一句相应的语句,一共产生了3个新的子进程,父进程重复打印1次,子进程重复打印一次,所以一共是打印了6句话。
本文出自 “momo就是辣么萌” 博客,请务必保留此出处http://momo462.blog.51cto.com/10138434/1791207
相关文章推荐
- windows和linux双系统删除linux
- linux宕机后根据地址来查看哪个函数出错
- 如何在linux系统中设置静态ip地址
- Linux下的两个辅助编程工具 perf 和 GDB
- Linux命令
- Wine虚拟技术及其使用
- VMware Workstation中linux(centos)与windows7共享文件夹
- (总结)Linux下使用rsync最快速删除海量文件的方法
- Linux:命令gedit
- 设备树(五)linux内核主线booting-without-of.txt
- 设备树(四)linux内核总线booting-without-of.txt
- 设备树(一)linux内核主线了解dts
- 第六章、Linux文件权限与目录配置
- 设备树(二)linux内核顶层am335x-evm.dts
- 设备树(三)linux内核主线次顶层common-335x-evm.dts
- linux遍历子进程浅析
- centos 温度监控软件
- linux学习心得
- linux,centos下解压tar,gz,bz2,tgz,zip等
- Linux和Windows下ActiveMQ下载、安装部署