重点函数: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读书笔记:进程控制的更多相关文章

  1. APUE读书笔记-第13章-守护进程

    第13章 守护进程 13.1 引言 *守护进程也称精灵进程(daemon)是生存期较长的一种进程.它们常常在系统自举时启动,仅在系统关闭时才终止.因为它们没有控制终端,所以说它们是在后台运行的.UNI ...

  2. APUE 读书笔记 -----孤儿进程与僵尸进程[总结] +数据结构+C

    http://www.cnblogs.com/Anker/p/3271773.html

  3. APUE读书笔记-第18章-终端I/O

    18.1 引言 *终端I/O的用途很广泛,包括用于终端.计算机之间的直接连线.调制解调器以及打印机等等,所以终端I/O系统非常复杂 18.2 综述 *终端I/O有两种不同的工作模式: (1)规范模式输 ...

  4. 【APUE | 08】进程控制

    函数fork 博文链接: 1. 代码示例: #include "apue.h" ; char buf[] = "a write to stdout\n"; in ...

  5. APUE读书笔记-第17章-高级进程间通信

    17.1 引言 *两种高级IPC:基于STREAMS的管道(STREAMS-based pipe)以及UNIX域套接字(UNIX domain socket)可以在进程间传送打开文件描述符.服务进程可 ...

  6. 《Two Days DIV + CSS》读书笔记——CSS控制页面方式

    1.1 你必须知道的知识 (其中包括1.1.1 DIV + CSS的叫法解释:1.1.2 DIV + CSS 名字的误区:以及1.1.3 W3C简介.由于只是背景知识,跳过该章.) 1.2 你必须掌握 ...

  7. APUE读书笔记-第14章-高级I/O

    14.1 引言 *高级I/O包括非阻塞I/O.记录锁.系统V流机制.I/O多路转换(select和poll函数).readv和writev函数以及存储映射I/O(mmap) 14.2 非阻塞I/O * ...

  8. APUE读书笔记:关于sigsuspend

    sigsuspend是一个原子操作,为了防止信号丢失而存在的,具体含义看下函数原型. int sigsuspend(const sigset_t *mask); 先忽略参数,sigsuspend完成的 ...

  9. 2013337朱荟潼 Linux第三章读书笔记——进程管理

    第三章 进程管理 总结 fork创造的子进程复制了父进程资源,包括内存及进程描述符的内容,资源的复制而不是指针的复制. vfork的行为更像一个线程(指没有自已独立的内存空间),更明显的是vfork的 ...

随机推荐

  1. Python第一天课程

    1.在linux下写python脚本,开头的解释器宣告的写法应该是#!/usr/bin/env python 定义变量name="XXX"  age=21   所有使用引号引起的内 ...

  2. js数组对象方法

  3. Trie树(字典树)

    传送门:http://hihocoder.com/problemset/problem/1014 #1014 : Trie树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描 ...

  4. 第三节,入门知识和windows系统安装python环境

    1.使用Linux的好处(稳定)不容易死机,可以长达几年不间断运行(安全)相对windows系统更安全,相对更不容受到各种攻击(开源)免费使用2.安装好虚拟机VMware软件,和Linux系统,以及X ...

  5. transform translate transition 的区别

    transform是变形,下面有translate transform: rotate旋转/scale缩放/skew扭曲/translate移动/matrix矩阵变形transform连写:rotat ...

  6. 《JS权威指南学习总结--第十一章子集和扩展》

    js子集和扩展:http://www.cnblogs.com/ahthw/p/4298449.html ES6新增let和const关键字:http://www.cnblogs.com/telnetz ...

  7. CSS3秘笈复习:第一章&第二章&第三章

    第一章: 1.<cite>标签不仅可以将网页设置为斜体,还能给标题做上标记,使它便于被搜索引擎搜索到. 第二章: 1.import指令链接样式表: CSS本身有一种添加外部样式的方法:@i ...

  8. qml 中 使用 shader

    使用绘制工具如Photoshop .Flash已经可以创建许多效果非常绚丽的图像.动画等. Qt/QML 的努力其实是在这些工具发展的后面, 因此很多效果在Qt中无法实现. 不得不佩服Qt小组的才智, ...

  9. ecshop里的$_CFG从哪来的

    以前经常有朋友问我, ecshop系统的$_CFG这个数组是从哪里来的,在哪里定义并赋值的.   下面就给大家说一下这个全局变量 $GLOBALS['_CFG']. ecshop里的 $_CFG数组主 ...

  10. Jquery结合datagrid框架

    <head>     <meta http-equiv="Content-Type" content="text/html; charset=utf-8 ...