APUE读书笔记:进程控制
重点函数:fork,exit,_exit
一、fork
函数原型:
#include <unistd.>
pid_t fork(void)
函数说明:fork函数将创建一个子进程,该函数调用一次,但是有两次返回。子进程返回值为0,父进程的返回值是该子进程的进程ID。
小技巧:父进程能够拿到该次fork生成的子进程的ID,这是唯一的机会。而子进程不需要关心自己的进程ID。通过是否关心子进程id,就能明确地区分是父进程还是子进程。
相关的函数:
获取自己的进程ID:getpid()
获取父进程ID:getppid()
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h> int main()
{
pid_t pid; if ((pid = fork()) < ) {
exit(-);
} else if (pid == ) {
printf("This is child. pid=%d, ppid=%d\n", getpid(), getppid()); //child
exit();
} else {
sleep();
printf("This is parent. pid=%d, ppid=%d\n", getpid(), getppid()); //parent
exit();
}
return ;
}
fork后的父子进程会共享哪些资源?
会共享持有的所有文件句柄。更多详情查看APUE(unix环境高级编程)中文版的175页。
特别地,IO缓存区作为特殊的文件句柄,也是会被共享的。
fork常见的使用场景:
1,一个父进程希望复制自己,使父子进程同时执行不同的代码段。这在网络服务中是常见的,父进程等待客户端的服务请求,当请求到达时,父进程fork一个子进程,子进程负责对该次请求作出处理和响应,而父进程则等待下一次服务请求的到达。
2,一个进程要执行一个不同的程序。在shell中是常见的,子进程从fork返回后立即调用exec。
常见的shell执行流:
假如要执行这条命令:ls -la ./,shell会先fork一个子进程,该子进程负责对命令进行处理,子进程处理结束后告诉它的父进程(shell进程)说我处理完了,可执行下一次命令。
二、exit退出函数
摘自APUE,178页
进程有5种正常终止方式:
1,在main函数内调用return。这种方式类似于exit。
2,调用exit函数。该函数由ISO C定义,其操作包括调用各种只处理程序,然后关闭所有标准IO流等。因为ISO C并不处理文件描述符,多进程以及作业控制,所以这一定义对于UNIX系统而言是不完整的。
3,调用_exit或者_Exit函数。ISO C定义_Exit,其目的是为进程提供一种无需运行终止处理程序或心法处理程序而终止的方法。对标准IO流是否进行冲洗,取决于系统的实现。在UNIX中,_exit和_Exit是同义的,并不清洗IO缓存(这意味着如果使用_exit来终止程序的话,io缓存区的内容不会输出到屏幕,也不会输出到文件)。_exit由exit调用。
4,进程的最后一个线程在启动例程中执行返回语句。
5,进程的最后一个线程调用pthread_exit函数。
有3种异常终止方式:
1,调用abort函数。
2,当进程接收到某些信号时。
3,最后一个线程对取消(cancellaction)请求作出响应。
不管如何终止,最后都会执行内核中的同一段代码。这段代码为响应进程关闭所有打开描述符,释放它所使用的存储器等。
note:对于大多数unix系统而言,exit是标准C库的一个函数,_exit是一个系统调用(系统调用指的是内核提供的接口)。
获取当前进程id:getpid
获取父进程id:getppid
APUE读书笔记:进程控制的更多相关文章
- APUE读书笔记-第13章-守护进程
第13章 守护进程 13.1 引言 *守护进程也称精灵进程(daemon)是生存期较长的一种进程.它们常常在系统自举时启动,仅在系统关闭时才终止.因为它们没有控制终端,所以说它们是在后台运行的.UNI ...
- APUE 读书笔记 -----孤儿进程与僵尸进程[总结] +数据结构+C
http://www.cnblogs.com/Anker/p/3271773.html
- APUE读书笔记-第18章-终端I/O
18.1 引言 *终端I/O的用途很广泛,包括用于终端.计算机之间的直接连线.调制解调器以及打印机等等,所以终端I/O系统非常复杂 18.2 综述 *终端I/O有两种不同的工作模式: (1)规范模式输 ...
- 【APUE | 08】进程控制
函数fork 博文链接: 1. 代码示例: #include "apue.h" ; char buf[] = "a write to stdout\n"; in ...
- APUE读书笔记-第17章-高级进程间通信
17.1 引言 *两种高级IPC:基于STREAMS的管道(STREAMS-based pipe)以及UNIX域套接字(UNIX domain socket)可以在进程间传送打开文件描述符.服务进程可 ...
- 《Two Days DIV + CSS》读书笔记——CSS控制页面方式
1.1 你必须知道的知识 (其中包括1.1.1 DIV + CSS的叫法解释:1.1.2 DIV + CSS 名字的误区:以及1.1.3 W3C简介.由于只是背景知识,跳过该章.) 1.2 你必须掌握 ...
- APUE读书笔记-第14章-高级I/O
14.1 引言 *高级I/O包括非阻塞I/O.记录锁.系统V流机制.I/O多路转换(select和poll函数).readv和writev函数以及存储映射I/O(mmap) 14.2 非阻塞I/O * ...
- APUE读书笔记:关于sigsuspend
sigsuspend是一个原子操作,为了防止信号丢失而存在的,具体含义看下函数原型. int sigsuspend(const sigset_t *mask); 先忽略参数,sigsuspend完成的 ...
- 2013337朱荟潼 Linux第三章读书笔记——进程管理
第三章 进程管理 总结 fork创造的子进程复制了父进程资源,包括内存及进程描述符的内容,资源的复制而不是指针的复制. vfork的行为更像一个线程(指没有自已独立的内存空间),更明显的是vfork的 ...
随机推荐
- Android:View颤抖的动画效果代码
public void propertyValuesHolderDown(final View view) { PropertyValuesHolder pvhX = PropertyValuesHo ...
- ListView上下线添加
<com.jclick.swipelistview.byzswipemenulistview.InScrollviewSwipeMenuListView android:id="@+i ...
- 淘淘商城_day03_课堂笔记
今日大纲 实现商品的编辑 实现商品的规格参数功能 搭建前台系统 实现首页商品类目的显示 商品的编辑 数据的编辑核心是:数据回显. 编辑按钮事件 判断选中的行数 弹出window 加载编辑页面,在页面加 ...
- 修改VirtualBox虚拟机默认存储路径及虚拟机迁移方法
修改默认安装路径 在安装完虚拟机以后发现我的虚拟的磁盘文件是放在C盘的,就想着有没有办法修改默认存储路径.后来发现确实可以修改,修改虚拟机方法如下:"管理"--->" ...
- js--事件对象的理解4
阻止默认行为:1.实例-简易修改右键菜单<script>document.oncontextmenu=function (ev){ var oEvent=ev||event; var oU ...
- hdu_5927_Auxiliary Set(xjb搞)
题目链接:hdu_5927_Auxiliary Set 题意: 给一棵n个节点的树,最开始全部都是重点,现在有q个询问,每次给你一些轻点,并叫你输出整棵树的重点数量, 轻点可能会变为重点,如果这个轻点 ...
- UESTC 1272 Final Pan's prime numbers(乱搞)
题目链接 Description Final Pan likes prime numbers very much. One day, he want to find the super prime n ...
- [ An Ac a Day ^_^ ] FZU 2030 括号问题 搜索
FZU一直交不上去 先写在这吧 #include<stdio.h> #include<iostream> #include<algorithm> #include& ...
- css3 box-shadow 阴影的用法
text-shadow是给文本添加阴影效果,box-shadow是给元素块添加周边阴影效果.随着html5和CSS3的普及,这一特殊效果使用越来越普遍. 基本语法是{box-shadow:[inset ...
- Erlang的Unicode支持
在R13A中, Erlang加入了对Unicode的支持.本文涉及到的数据类型包括:list, binary, 涉及到的模块包括stdlib/unicode, stdlib/io, kernel/fi ...