本章介绍UNIX系统的进程控制,包括创建新进程、执行程序和进程终止。

进程标识

每一个进程都有一个非负整数表示的唯一进程ID,除了进程ID,每个进程还有一些其他标识符。下列函数返回这些标识符

#include <unistd.h>
pid_t getpid(void);
pid_t getppid(void);
uid_t getuid(void);
uid_t geteuid(void);
gid_t getgid(void);
gid_t getegid(void);

函数fork

一个现有的进程可以调用fork函数创建一个新进程

#include <unistd.h>
pid_t fork(void);

由fork创建的新进程被称为子进程。fork函数被调用一次,但是返回两次

子进程的返回值是0,父进程的返回值则是新建子进程的进程ID。

fork之后是父进程还是子进程先执行是不确定的,这取决于内核所使用的调度算法。

子进程和父进程继续执行fork调用之后的指令,子进程获得父进程数据空间、堆和栈的副本。注意,父子进程并不共享这些存储空间部分,只共享正文段。

函数vfork

vfork函数用于创建一个新进程,而该新进程的目的是exec一个新程序。

vfork与fork一样都创建一个子进程,但是它并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec(或exit)。

不过在子进程调用exec或exit之前,它在父进程的空间中运行。

vfork和fork之间的另一个区别是:vfork保证子进程先运行,在它调用exec或exit之后父进程才可能被调度运行。

函数wait和waitpid

#include <sys/wait.h>
pid_t wait(int *statloc);
pid_t waitpid(pid_t pid,int *statloc,int options);

这两个函数的区别如下:

在一个子进程终止前,wait使其调用者阻塞,而waitpid有一选项,可使调用者不阻塞。

waitpid并不等待在其调用之后的第一个终止子进程,它有若干个选项,可以控制它所等待的进程。

对于waitpid函数中pid参数的作用解释如下:

pid==-1  等待任一子进程。与wait等效

pid>0  等待进程ID与pid相等的子进程

pid==0  等待组ID等于调用进程组ID的任一子进程

pid<-1  等待组ID等于pid绝对值的任一子进程

options参数使我们进一步控制waitpid的操作。此参数或者是0,或者是下图中常量按位或运算的结果

函数exec

有7种不同的exec函数可供使用,当进程调用一种exec函数时,该进程执行的程序完全替换成新程序。

#include <unistd.h>
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg,..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],char *const envp[]);
int fexecve(int fd,char *const argv[],char *const envp[]);

path指定路径名为参数,当指定file作为参数时:

1 如果file中包含/,则就将其视为路径名

2 否则就按PATH环境变量,在它指定的各目录中搜寻可执行文件

7个exec函数之间的区别

这7个函数只有execve是内核的系统调用。另外6个只是库函数,最终都要调用该系统调用。下图是这7个函数之间的关系

 函数system

#include <stdlib.h>
int system(coast char *cmdstring);

apue学习笔记(第八章 进程控制)的更多相关文章

  1. 《UNIX环境高级编程》(APUE) 笔记第八章 - 进程控制

    8 - 进程控制 Github 地址 1. 进程标识 每个进程都有一个非负整型表示的 唯一进程 ID .进程 ID 是可复用的(延迟复用算法). ID 为 \(0\) 的进程通常是调度进程,常常被称为 ...

  2. APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause

    转载注明出处:Windeal学习笔记 kil和raise kill()用来向进程或进程组发送信号 raise()用来向自身进程发送信号. #include <signal.h> int k ...

  3. APUE学习笔记3_文件IO

    APUE学习笔记3_文件IO Unix中的文件IO函数主要包括以下几个:open().read().write().lseek().close()等.这类I/O函数也被称为不带缓冲的I/O,标准I/O ...

  4. .NET MVC 学习笔记(七)— 控制input控件

    .NET MVC 学习笔记(七)— 控制input控件 画面中有时候需要输入数字,这时就需要控制input的输入.以下为保留两位有效数字. /* * 初始化数字输入 */ function initD ...

  5. apue学习笔记(第一章UNIX基础知识)

    总所周知,UNIX环境高级编程是一本很经典的书,之前我粗略的看了一遍,感觉理解得不够深入. 听说写博客可以提高自己的水平,因此趁着这个机会我想把它重新看一遍,并把每一章的笔记写在博客里面. 我学习的时 ...

  6. EasyARM i.mx287学习笔记——通过modbus tcp控制GPIO

    0 前言     本文使用freemodbus协议栈,在EasyARM i.mx287上实现了modbus tcp从机. 在该从机中定义了线圈寄存器.当中线圈寄存器地址较低的4位和EasyARM的P2 ...

  7. V-rep学习笔记:关节力矩控制

    Torque or force mode When the joint motor is enabled and the control loop is disabled, then the join ...

  8. Beego 学习笔记14:Session控制

    Session控制 1>     Session常用来作为全局变量使用,比如记录当前登录的用户,或者页面之间传递数据使用. 2>     Beego框架内置了 session 模块,目前 ...

  9. 【疯狂Java讲义学习笔记】【流程控制与数组】

    [学习笔记]1.switch语句后的expression表达式的数据类型只能是byte.short.char.int四个整数类型.String(Java 7后才支持)和枚举类型. 2.数组的长度不可变 ...

随机推荐

  1. 城市改造 (city)

    城市改造 (city) 题目描述 为了节约当前社会巨大的能源消耗,A 城市发起了新能源改造计划,也就是用太阳能代替旧能源.为了简化题意,可以假设 A 城市在一个二维平面上,平面上从11到nn每一个地方 ...

  2. 浅谈 easyui tabs 的href和content属性

    众所周知,jQuery Easyui 的tabs插件有两种方式加载某个tab(标签页)上的内容:“href远程请求”和“content本地内容”,本文就两种方式的优缺点进行简单分析和思考. 两者特点: ...

  3. python获取目录下文件夹名称

    path = '/opt' dirs = os.listdir(path) for dir in dirs: print dir

  4. manifest

    manifest是一种软件,属于AndroidManifest.xml文件,在简单的Android系统的应用中提出了重要的信息,它可以运行任何应用程序的代码. 每个安卓应用程序必须有一个Android ...

  5. JAVA神操作--使用Arthas线上热更新实战

    热更不规范,同事两行泪 背景 C君是一个javaer,最近在开发用户登出接口的时候,不小心把接口参数拼错了 正确的是: /api/v1/user/logout?referrer=www.javaer. ...

  6. Javascript&Ajax-深入浅出JSONP--解决ajax跨域问题

    Javascript&Ajax-深入浅出JSONP--解决ajax跨域问题 原理讲解: 链接地址:http://www.cnblogs.com/chopper/archive/2012/03/ ...

  7. pyspider 爬虫教程(一):HTML 和 CSS 选择器

      虽然以前写过 如何抓取WEB页面 和 如何从 WEB 页面中提取信息.但是感觉还是需要一篇 step by step 的教程,不然没有一个总体的认识.不过,没想到这个教程居然会变成一篇译文,在这个 ...

  8. bzoj 1228 [SDOI2009]E&D SG函数打表 找规律

    题目链接 Description 桌子上有2n 堆石子,编号为1..2n.将第2k-1 堆与第2k 堆(1 ≤ k ≤ n)为同一组.第i堆的石子个数用一个正整数Si表示.一次分割操作指的是,从桌子上 ...

  9. android基本控件学习-----ToggleButton&Switch

    ToggleButton(开关按钮)和Switch(开关)讲解: 一.核心属性讲解: (1)ToggleButton textOn:按钮被选中的时候文字显示 textOff:按钮没有被选中的时候文字显 ...

  10. hdu 3879 hdu 3917 构造最大权闭合图 俩经典题

    hdu3879  base station : 各一个无向图,点的权是负的,边的权是正的.自己建一个子图,使得获利最大. 一看,就感觉按最大密度子图的构想:选了边那么连接的俩端点必需选,于是就以边做点 ...