linux系统如何使用fork函数创建子进程
来源:互联网 发布:2017双十一交易数据 编辑:程序博客网 时间:2024/05/15 23:51
大家都知道linux是多进程的系统。可是,在linux中,进程是如何创建并运行的呢?
在linux系统中创建进程有两种方式:一是由操作系统创建,二是由父进程创建进程(通常为子进程)。系统调用函数fork()是创建一个新进程的唯一方式,fork()函数是Linux系统中一个比较特殊的函数,其一次调用会有两个返回值。
fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程。父进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程(父进程)的所有值都复制到新的新进程(子进程)中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。
我们来看一个例子:
#include <unistd.h>#include <stdio.h>int main (){ pid_t fpid; fpid = fork(); if (fpid < 0) { printf("error in fork!"); } else if (fpid == 0) { printf("this is child process, pid %d/n",getpid()); } else { printf("this is parent process, pid %d/n",getpid()); } return 0;}
运行结果是:
this is child process, pid 5574this is parent process, pid 5573
在语句fpid=fork()之前,只有一个进程在执行这段代码,但在这条语句之后,就变成两个进程在执行了,这两个进程的几乎完全相同,将要执行的下一条语句都是if (fpid<0)……
为什么两个进程的fpid不同呢,这与fork函数的特性有关。fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
1)在父进程中,fork返回新创建子进程的进程ID;
2)在子进程中,fork返回0;
3)如果出现错误,fork返回一个负值;
在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。
fork出错可能有两种原因:
1)当前的进程数已经达到了系统规定的上限,这时errno的值被设置为EAGAIN。
2)系统内存不足,这时errno的值被设置为ENOMEM。
创建新进程成功后,系统中出现两个基本完全相同的进程,这两个进程执行没有固定的先后顺序,哪个进程先执行要看系统的进程调度策略。
每个进程都有一个独特(互不相同)的进程标识符(process ID),可以通过getpid()函数获得,还有一个记录父进程pid的变量,可以通过getppid()函数获得变量的值。
参考资料:
1、http://blog.csdn.net/jason314/article/details/5640969
2、http://blog.csdn.net/cywosp/article/details/27316803
- linux系统如何使用fork函数创建子进程
- linux系统编程学习day2--fork()函数的使用和子进程的创建
- LInux 子进程创建函数fork简介
- Linux 创建子进程函数 --- fork
- Linux fork()创建子进程
- linux fork创建子进程
- wait函数在fork创建子进程后的使用
- wait函数在fork创建子进程后的使用
- wait函数在fork创建子进程后的使用
- wait函数在fork创建子进程后的使用
- wait函数在fork创建子进程后的使用
- wait函数在fork创建子进程后的使用
- Linux进程创建fork()函数
- fork()函数-创建子进程
- Linux 调用fork()创建两个子进程
- linux之fork,vfork创建子进程
- 【操作系统】linux创建子进程--fork()方法
- 【操作系统】linux创建子进程--fork()方法
- Windows apache httpd 卡死解决办法
- Archives 到 App Store 报错 ERROR ITMS-90149: ERROR ITMS-90087: ERROR ITMS-90023: ERROR ITMS-4238:
- CCF CSP认证 难度及经历
- PCI设备BAR空间的初始化
- Ubuntu下安装搜狗输入法
- linux系统如何使用fork函数创建子进程
- C语言调试记录
- c++基础の引用、const
- 线段树求某值之前或之后与其差值不小于k的最近位置
- Hession与webservice调用之间的区别与联系
- 2.4梯度下降法
- 1048. 数字加密
- 田忌赛马
- 凯撒密码加密你的姓名拼音(c)