Linux多任务编程之五:exit()和_exit()函数(转)

来源:CSDN  作者:王文松   转自:Linux公社

------------------------------------------------------------------------------------------------------------------------------------------------

wait()和waitpid()

函数说明

wait()函数用于使父进程(也就是调用wait()的进程)阻塞,直到一个子进程结束或者该进程接收到了一个指定的信号为止。如果该父进程没有子进程或者它的子进程已经结束,则wait()函数就会立即返回。

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

函数格式

下图为wait()函数的格式

下图为waitpid()函数的格式

基础实验

实验1

本实验中首先使用fork()创建一个子进程,然后让其子进程暂停5s(使用了sleep()函数)。接下来对原有的父进程使用waitpid() 函数,并使用参数WNOHANG是该父进程不会阻塞。若有子进程退出,则waitpid()返回子进程号;若没有子进程退出,则waitpid()返回 0,并且父进程每隔1s循环判断一次。该程序的流程图如下:

程序源代码我上传到网站,可以免费下载waitpid.c文件,点此下载

下载文件后,使用命令:gcc waitpid.c -o waitpid

然后执行命令:./waitpid 结果如下图;

从输出结果就可以看出程序的执行流程。先执行一次父进程,父进程睡眠1s,此时执行子进程,然后子进程睡眠5秒;接着再执行父进程监听。哎哟我去我不分析流程了,怕再说迷糊了。

实验2

本实验使用函数wait(),同实验2一样,也是先用fork()新建一个子进程,然后让子进程暂停5s。接下来对原有的父进程使用wait()函数。不同的是,wait()函数会使得父进程阻塞,通过本实验的结果就可以看出。代码如下:

执行结果如下图

我建议你亲自实验一下,能很明显的看出不同。

wait.c文件下载

免费下载地址在 http://linux.linuxidc.com/

用户名与密码都是www.linuxidc.com

具体下载目录在 /2013年资料/6月/12日/Linux多任务编程

时间: 2024-11-05 18:41:00

Linux多任务编程之五:exit()和_exit()函数(转)的相关文章

Linux多任务编程之四:exit()函数及其基础实验(转)

来源:CSDN  作者:王文松   转自Linux公社 exit()和_exit()函数 函数说明 创建进程使用fork()函数,执行进程使用exec函数族,终止进程则使用exit()和_exit()函数.当进程执行到exit()或 _exit()函数时,进程会无条件的停止剩下的所有操作,清除各种数据结构,并终止本进程的运行.但是,这两个函数还是有区别的,其调用过程如图1所 示: 从图1可以看出,_exit()函数的作用是:直接使进程停止运行,清除其使用的内存空间,并清除其在内核中的各种数据结构

exit()和_exit()函数(转)

转自    http://www.cnblogs.com/hnrainll/archive/2011/08/17/2142001.html进程退出 1.在Linux中任何让一个进程退出 进程退出表示进程即将结束.在Linux中进程退出分为了正常退出和异常退出两种. 1>正常退出  a. 在main()函数中执行return . b.调用exit()函数 c.调用_exit()函数 2>异常退出  a.调用abort函数 b.进程收到某个信号,而该信号使程序终止. Tiger-John说明:不管

exit()与_exit()函数的区别

进程就好比人一样有其生命,我们通过fork()函数来创建一个进程,那么我们又是如何来中止进程呢. 1.Linux中的进程退出 进程退出表示进程即将结束.在Linux中进程退出分为了正常退出和异常退出两种. (1)正常退出 a. 在main()函数中执行return: b.调用exit()函数: c.调用_exit()函数. (2)异常退出 a.调用about函数: b.进程收到某个信号,而该信号使程序终止. 补充:不管是那种退出方式,系统最终都会执行内核中的同一代码.这段代码用来关闭进程所用已打

Linux多任务编程之七:Linux守护进程及其基础实验(转)

来源:CSDN  作者:王文松  转自Linux公社 ------------------------------------------------------------------------------------------------ 守护进程概述 守护进程,又叫daemon进程(不知怎的,我突然想起来吸血鬼日记中的达蒙了,很好看的美剧),是Linux中的后台服务进程. 他是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或者等待处理某些发生的事件.守护进程常常在系统

Linux环境编程之进程(三):函数间跳转

引言:在编写程序时,经常在函数内部使用goto语句来跳转,从而进行出错处理,那么如果想要在函数之间进行跳转该怎么做呢?使用setjmp和longjmp函数. 给出示例程序: #include <stdio.h> #include <stdlib.h> #include <setjmp.h> static void f1(int, int, int, int); static void f2(void); static jmp_buf jmpbuffer; static

Linux Shell编程之五字符串的处理

shell编程之字符串处理 在 shell 中,由于是一种弱类型的语言,在没有事先申明变量类型的情况下,所有的变量都是字符串.所以对字符串的处理就显得相当重要了. 下面介绍常见的对字符串处理的操作. 一.字符串切片 ${string_var:offest:length},类似于数组元素的提取. # 这里的string_var是一个变量,offest 是字符串的开始偏移量,length是切去字符串的长度 var=dhcpd:x:177:177:DHCP server:/:/sbin/nologin

exit()与_exit()函数的区别(Linux系统中)

注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXIT_SUCCESS);可读性比较好一点. 作为系统调用而言,_exit和exit是一对孪生兄弟,它们究竟相似到什么程度,我们可以从Linux的源码中找到答案: #define __NR__exit __NR_exit /* 摘自文件include/asm-i386/unistd.h第334行 */

Linux多任务编程之三:exec函数族及其基础实验(转)

来源:CSDN  作者:王文松  转自:Linux公社 exec函数族 函数族说明 fork() 函数用于创建一个新的子进程,该子进程几乎复制了父进程的全部内容,但是,这个新创建的子进程如何执行呢?exec 函数族就提供了一个在进程中启动另一个程序执行的方法.它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段.代码段和堆栈 段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新的进程替换了.另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执 行

exit()和_exit()函数

具体内容参考:http://www.cnblogs.com/hnrainll/archive/2011/08/17/2142001.html 项目中用到的地方: if (state[state.articleName] && state[state.articleName].exit) { state[state.articleName].exit()} 如参考中提到的exit和return的区别:1.a.exit是一个函数,有参数.exit执行完后把控制权交给系统2.b.return是函