Linux fork创建子进程
1. pid_t fork(void);
功能:创建父子进程
参数:无
返回值:成功:在父进程中:返回值为子进程的PID
在子进程中:返回值为0
失败:-1
注意:
1)fork函数是用来创建进程的,fork之后产生了两个进程,每个进程都会有返回值,
所以父进程中返回的是子进程的进程号(>0);在子进程中返回0
2)子进程几乎拷贝了父进程的全部内容。
包括代码、数据、系统数据段中的pc值、栈中的数据、父进程中打开的文件等;但它们的PID、PPID是不同的。
3)父子进程有独立的地址空间,互不影响;当在相应的进程中改变全局变量静态变量,都互不影响。
4)若父进程先结束,子进程成为孤儿进程被init进程收养(此时子进程的父亲就是init),子进程变成后台进程。(init进程号为1)
5)若子进程先结束,父进程如果没有及时回收,子进程变成僵尸进程(要避免僵尸进程产生)
2. pid_t getpid(void);
功能:得到正在调用此接口的进程的进程号
返回值:得到PID号
3. pid_t getppid(void);
功能:得到正在调用此接口的进程的父进程号
返回值:得到PID
4. pid_t wait(int *status) 头文件 <sys/types.h> <sys/wait.h>
功能:阻塞等待任意子进程的结束,回收资源
status是一个整型指针,指向的对象用来保存子进程退出时的状态。
status若为空,表示忽略子进程退出时的状态
status若不为空,表示保存子进程退出时的状态
另外,子进程的结束状态可由Linux中一些特定的宏来测定。
5. pid_t waitpid(pid_t pid, int *status, int options)
功能:等待子进程的结束,回收资源
参数:
(1)pid:
pid>0:只等待进程ID等于pid的子进程,不管已经有其他子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。
pid=-1:等待任何一个子进程退出,此时和wait作用一样。
(2)status:同wait
(3)options:WNOHANG:不阻塞,返回 0(没有接受到),pid号(成功接收到) 0:同wait,阻塞父进程,等待子进程退出。失败 -1 ,成功 pid号
返回值:
正常:结束的子进程的进程号,使用选项WNOHANG且没有子进程结束时:0
出错:-1
等价:wait(NULL) == waitpid(-1, NULL, 0)
WEXITSTATUS(status)
6. void exit(int status);
功能:结束正在调用的进程,程序结束前,会清理缓存区
7. _exit:void _exit(int status);
功能:结束正在调用的进程,程序结束前不清理缓存区
注意:
status是一个整型的参数,可以利用这个参数传递进程结束时的状态。
通常0表示正常结束;其他的数值表示出现了错误,进程非正常结束。
在实际编程时,可以用wait系统调用接收子进程的返回值,进行相应的处理。
exit用于结束正在运行的整个程序,它将参数返回给OS,把控制权交给操作系统;
而return 是退出当前函数,返回函数值,把控制权交给调用函数。
fork创建子进程例子:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <unistd.h> int main(int argc, const char *argv[])
{
pid_t pid;
pid = fork();
if(pid == -)//失败返回 -1
{
perror("fork fail : ");
exit();
}
else if(pid == ) //在子进程中:返回值为0
{
printf("child\n");
printf("child getpid() %d \n",getpid());
printf("child getppid() %d \n",getppid());
exit();
}
else //在父进程中:返回值为子进程的PID
{
int s;
wait(&s);
printf("fork\n");
printf("father pid %d\n",pid);//子进程pid
printf("father getpid() %d \n",getpid()); //父进程pid
printf("father getppid() %d \n",getppid());//父进程的父进程的pid
printf("father %d\n",WEXITSTATUS(s));
perror((char*)&s);
}
return ;
}
测试:

子进程会复制父进程的全部内容,出来pid号和ppid号,但是子进程程序执行从 fork 函数之后执行的
Linux fork创建子进程的更多相关文章
- 利用fork创建子进程
创建如图的进程: #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<wait. ...
- 2.1 进程控制之fork创建子进程
fork()函数 目标:熟悉fork创建一个和多个子进程子线程 函数原型:pid_t fork(void); 返回值:成功返回:① 父进程返回子进程的ID(非负) ②子进程返回 0 : 失败返回-1. ...
- 线程_互斥锁_Lock及fork创建子进程
""" 创建锁 mutex = threading.Lock() 锁定 mutex.acquire([blocking]) 当blocking为True时,当前线程会阻塞 ...
- Python 使用 os.fork() 创建子进程
Linux 操作系统提供了一个 fork() 函数用来创建子进程,这个函数很特殊,调用一次,返回两次,因为操作系统是将当前的进程(父进程)复制了一份(子进程),然后分别在父进程和子进程内返回.子进程永 ...
- fork()创建子进程
fork()系统调用是Unix下以自身进程创建子进程的系统调用,一次调用,两次返回,如果返回是0,则是子进程,如果返回值>0,则是父进程(返回值是子进程的pid) 在fork()的调用处,整个父 ...
- Linux下利用fork()创建子进程并使父进程等待子进程结束
int status; pid_t t = fork(); if(t){ waitpid(t, &status, 0); }else{ system("vi temp ...
- windows、linux创建子进程
在windows下创建子进程较常用到的API就是CreateProcess,可以通过以下的方式启动一个新进程: STARTUPINFO si = {0}; PROCES ...
- linux中fork创建进程讲解(转)
大家知道Linux中创建子进程的一个很好的方法是函数调用fork,但是很多初学者对fork的理解上可能有点困难.我们举个例子来看看fork的用法吧. 大家用fork的时候记住fork是 ...
- exec族函数详解及循环创建子进程
前言:之前也知道exec族函数,但没有完全掌握,昨天又重新学习了一遍,基本完全掌握了,还有一些父子进程和循环创建子进程的问题,还要介绍一下环境变量,今天分享一下. 一.环境变量 先介绍下环境的概念和特 ...
随机推荐
- 面试题: nodejs 的事件轮询机制
setTimeout(function(){ console.log('setTimeout()执行了') },0) setImmediate(function(){ console.log('set ...
- sysprep
今天做虚拟机模板,以及克隆.单纯的克隆会造成很多冲突问题的产生,所以在这里,windows自带的sysprep功能很好的解决了这一点. 路径位于:C:\Windows\System32\Sysprep ...
- 牛客练习赛48 C,D,E
C 小w的糖果 题意:3种操作,第一种是使pos右边的数全部+1,第二种是pos右边的数依次+k(k从1开始递增),第三种是pos右边的数依次+k^2(k从1开始递增). 解法:第一种我们很容易想到差 ...
- 浅谈异步上传插件 jquery-file-upload插件
当我们需要异步上传文件的时候,我们倾向于在网上查找相关的JQuery插件,jquery-file-upload就是我们经常看到的,但是他的主页是英文的,对于我们这些英语比较差的同学来说,简直就是... ...
- hibernate3.6异常
WARN DTDEntityResolver:73 - recognized obsolete hibernate namespace http://hibernate.sourceforge.net ...
- Python排序功能进阶
sorted和sort() li = [9, 1, 8, 2, 7, 3, 6, 4, 5] s_li = sorted(li) print ('Sorted Variable: \t', s_li) ...
- 关于ps前端工程师简单配置
1.创建Web网页设计稿的预设参数 1920*1080 72 透明 2.定位组或定位图层 可以在ps选项栏中,勾选“自动选择”+组/图层 或者 ctrl键+组/图层: 3.视图 ...
- C循环
C 循环 有的时候,可能需要多次执行同一块代码.一般情况下,语句是顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推. 编程语言提供了允许更为复杂的执行路径的多种控制结构. 循环语句允许 ...
- 「NOI2016」循环之美(小性质+min_25筛)
传送门. 题解 感觉这题最难的是第一个结论. x/y首先要互质,然后如果在10进制是纯循环小数,不难想到y不是2.5的倍数就好了. 因为十进制下除以2和5是除得尽的. 必然会多出来的什么东西. 如果是 ...
- [bzoj2729][HNOI2012]排队 题解 (排列组合 高精)
Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不 ...