一、多进程操作的基本函数

1.fork

函数头文件及函数原型

#include <unistd.h>

pid_t fork(void);

在Linux中创建一个新进程的唯一方法是使用fork()函数。

fork()函数是Linux中一个非常重要的函数,用于从已存在的进程中创建一个新进程。新进程称为子进程,而原进程称为父进程。

使用fork()函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间,包括进程的上下文、代码段、进程堆栈、内存信息、打开的文件描述符、符号控制设定、进程优先级、进程组号、当前工作目录、根目录、资源限制、信号处理方式和控制终端等,而子进程所独有的只有它的进程号、资源使用和计时器等。

实际是在父进程中执行fork()函数时,父进程会复制一个子进程,而且父子进程的代码从fork()函数的返回开始分别在两个地址空间中同时运行,从而使两个进程分别获得所属fork()函数的返回值,其中在父进程中的返回值是子进程的进程号,而在子进程中返回0,若出错返回-1。也就是说,父进程调用fork会返回非0和-1的值,而子进程会返回0,fork失败时返回-1。可以根据返回值判断是父进程还是子进程。


2.exit与_exit

进程的终止分为两种:异常终止和正常终止

异常终止的情况包括:①进程收到某种信号;②调用abort()函数;

正常终止的情况包括:①main()函数return;②调用exit()或_exit()函数;

exit函数与_exit函数的区别:

1.exit()函数执行时会无条件停止剩下的所有操作,清理包括PCB在内的各种数据结构,并终止本进程的运行,在执行推出之前加了若干道工序,它要检查文件的打开情况,把文件缓冲区的内容写回文件,即“清理I/O缓冲”。

_exit()函数的作用是直接使进程停止运行,清除其使用的内存空间,并清楚其在内核中的数据结构。

调用_exit()函数时,缓冲区的记录无法输出。

调用exit()函数时,缓冲区的记录也能正常输出。调用exit()之后,该进程并不会马上完全消失,而是留下了一个成为僵尸(Zombie)的数据结构。


3.wait和waitpid

作用:暂时停止目前进程的执行, 直到有信号来到或子进程结束。

函数头文件及函数原型

#include <sys/types.h>

#include <sys/wait.h>

pid_t wait(int *status);

pid_t waitpid(pid_t pid, int *status, int options);

wait()函数用于使父进程(也就是调用wait()的进程)阻塞,直到一个子进程结束或该进程接收到一个指定的信号为止。如果该父进程没有子进程或它的子进程已经结束,则wait()就会立即返回。其中参数status整型指针是子进程退出时调用exit或_exit使用的参数

waitpid()的作用和wait()一样,但它并不一定要等待一个终止的子进程,它还有若干选项,如可提供一个非阻塞版本的wait()功能,也能支持作用控制。实际上,wait()函数只是waitpid()函数的一个特例,在Linux内部实现wait()函数时直接调用的就是waitpid()函数。

参数pid 为欲等待的子进程识别码, 其他数值意义如下:

1、pid<-1等待进程组识别码为pid 绝对值的任何子进程。

2、pid=-1等待任何子进程, 相当于wait()。

3、pid=0等待进程组识别码与目前进程相同的任何子进程。

4、pid>0只等待任何子进程识别码等于pid 的子进程,不管是否有其他子进程结束, 只要指定子进程未结束,一直等。

参数option 可以为0或下面的OR 组合:

WNOHANG: 如果没有任何已经结束的子进程则马上返回, 不予以等待。

WUNTRACED:如果子进程进入暂停执行情况则马上返回, 但结束状态不予以理会.子进程的结束状态返回后存于status。

4.判别结束情况的函数:

WIFEXITED(status): 用来指出子进程是否为正常退出的,如果是,它会返回一个非零值。

WEXITSTATUS(status):取得子进程exit()返回的结束代码, 一般会先用WIFEXITED 来判断是否正常结束才能使用此宏。 可以用这个宏来提取子进程的返回值,如果子进程调用exit(5)退出,  WEXITSTATUS(status)就会返回5;如果子进程调用exit(7)退出, WEXITSTATUS(status)就会返回7。如果进程不是正常退出, 也就是说,WIFEXITED返回0,这个值就毫无意义了。

WIFSIGNALED(status):如果子进程是因为信号而结束则此宏值为真。

WTERMSIG(status): 取得子进程因信号而中止的信号代码, 一般会先用WIFSIGNALED 来判断后才使用此宏。

WIFSTOPPED(status): 如果子进程处于暂停执行情况则此宏值为真. 一般只有使用WUNTRACED时才会有此情况。

WSTOPSIG(status): 取得引发子进程暂停的信号代码, 一般会先用WIFSTOPPED 来判断后才使用此宏。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355