重点函数: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. NS_ASSUME_NONNULL_BEGIN 延伸

    NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END 在.h文件中,可以看到这两个宏,翻看定义,这两个宏的代码是 #define NS_ASSUME_NONNUL ...

  2. vsphere安装虚拟机

    新建虚拟机完成后,启动虚拟机,打开启动虚拟机控制台,选择CD/DVD驱动器 选择iso镜像,可以是本地或存储中心的iso,选择后点击虚拟机--客户机--发送Ctrl+Alt+Del,接下来就是正常的操 ...

  3. python之~ 序列化与反序列化

    sy1.proto文件 syntax = "proto2"; message stuff { required int32 stuff_ID = ; required ; opti ...

  4. Html网页的代码

    Html网页的代码 很全哦 1)贴图:<img src="图片地址"> 2)加入连接:<a href="所要连接的相关地址">写上你想写 ...

  5. ViewBag的简单使用

    一,在控制器中写好数据绑定 //通过ID查找出整列的数据            Case.Models.Case theCase = db.Case.Find(id);            View ...

  6. B树(B-树)

    1.什么是B树(B-树)? B树是一种m阶树,m>=2 性质: 1)树中每个结点至多m个孩子: 2)对于根结点,子树个树取值范围为[2,m],关键字个数范围[1,m-1]: 3)对于非根非叶结点 ...

  7. 关于python的类方法、实例方法和静态方法区别

    python的类方法需要在方法前面加装饰器:@classmethod ,静态方法是在方法前面加装饰器:@staticmethod. 类方法.类属性是属于类自身,属于类自身的命名空间,和实例方法.实例属 ...

  8. [ An Ac a Day ^_^ ] UVALive 2635 Housing Complexes 二分图最大匹配

    快要比赛了 看看原来做过的题 感觉这道题当时做的还是挺费劲的 所以发一下 题意: 一个土豪要建别墅 因为有的地区地方不够大 所以要拆屋子 每个地方的字母就是对应开发商的地盘 没有字母的就是自由土地 一 ...

  9. css3制作字体

    代码教程 HTML代码用H1吧,这样语义化好些,因为标题一般用h1-h6. <h1 class="vintage">美丽的中国语</h1> 纯CSS制作的复 ...

  10. PHP验证码类

    通过PHP的GD库图像处理内容,设计一个验证码类Vcode.将该类声明在文件vcode.class.php中,并通过面向对象的特性将一些实现的细节封装在该类中.只要在创建对象时,为构造方法提供三个参数 ...