Linux下C编程:关于进程等待

#include <sys/types.h>
#include <stdio.h>
#include <sys/wait.h>      

void check_exit(int status);      

main()
{
    pid_t pid;
    int status;
    if((pid = fork()) < 0)
    {
    printf("fork error!!\n");
    exit(0);
    }
    else if(pid == 0)
    {
    printf("child process exit\n");      

    exit(0);
    }
    else
    {
        if(wait(&status) != pid)
        {
        printf("wait error!!");
        exit(0);
        }
        check_exit(status);
    }      

}
void check_exit(int status)
{
    if(WIFEXITED(status))
        printf("eixt\n");      

    else if(WIFSIGNALED(status))
        printf("killed by signal\n");
    else if(WIFSTOPPED(status))
        printf("stopped by signal\n");
    else if(WIFCONTINUED(status))
        printf("continued");
}

等待进程改变其状态。所有下面哪些调用都被用于等待子进程状态的改 变,获取状态已改变的子进程信息。状态改变可被认为是:1.子进程已终止。2.信号导致子进程停止执行。3.信号恢复子进程的执行。在子进程终止的情况 下,wait调用将允许系统释放与子进程关联的资源。如果不执行wait,终止了的子进程会停留在"zombie"状态。

如果发现子进程改变了状态,这些调用会立即返回。反之,调用会被阻塞直到子进程状态改变,或者由信号处理句柄所中断(假如系统调用没有通过sigaction的SA_RESTART标志重启动)。

wait 系统调用挂起当前执行中的进程,直到它的一个子进程终止。waitpid挂起当前进程的执行,直到指定的子进程状态发生变化。默认,waitpid只等待 终止状态的子进程,但这种行为可通过选项来改变。waitid系统调用对于等待哪个子进程状态改变提供了更精确的控制。
 
子进程已终 止,父进程尚未对其执行wait操作,子进程会转入“僵死”状态。内核为“僵死”状态的进程保留最少的信息量(进程标识,终止状态,资源使用信息),过后 父进程执行wait时可以获取子进程信息。只要僵死的进程不通过wait从系统中移去,它将会占据内核进程表中的一个栏位。如果进程表被填满,内核将不能 再产生新进程。如果父进程已终止,它的僵死子进程将由init进程收养,并自动执行wait将它们移去。

wait(等待子进程中断或结束)

#include<sys/types.h>      

#include<sys/wait.h>      

pid_t wait (int * status);

函数说明

;wait()会暂时停止目前进程的执行(挂起父进程),直到有信号来到或子进程结束。如果在调用 wait()时子进程已经结束,则 wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数 status 返回,而子进程的进程识别码也会一快返回。如果不在意结束状态值,则参数 status 可以设成 NULL。如果调用wait的进程没有子进程则会调用失败,子进程的结束状态值请参考 waitpid( )    

如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1。失败原因存于errno 中。

查看全套文章:http://www.bianceng.cn/Programming/C/201212/34807.htm

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索printf
, include
, 进程
, 结束进程
, 状态
, status
, wait
, 子进程
, 编程控制pid
, fork printf
, 已终止操作
, 等待结束
, 已终止
进程识别码
,以便于您获取更多的相关知识。

时间: 2024-11-03 03:36:27

Linux下C编程:关于进程等待的相关文章

Linux下C编程,进程通信之标准流管道通信(即系统调用)

1.概述 在编程的过程中总会需要使用系统调用,如linux下的ps,touch,rm,grep命令等:windows下的dir,mkdir,del命令等. 在linux中执行系统调用,通常使用标准流管道. 标准流管道将一系列的创建过程合并到一个函数popen()中.poen完成的工作有以下几步: (1)创建一个管道. (2)fork一个子进程. (3)在父子进程中关闭不需要的文件描述符. (4)执行exec函数族调用. (5)执行函数中所指定的命令. 2.主要函数说明 FILE*popen(co

Linux下C编程,进程通信之无名管道通信

最近在看进程间的通信,下面说说管道通信之无名管道. 1.概述 管道是Linux中很重要的一种通信方式,他是把一个程序的输出直接连接到另一个程序的输入,并且管道具有队列的特性.如Linux命令,"ps -ef | grep root".如下图所示: 2.无名管道 2.1特点 (1)它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间). (2)它是一个半双工的通信模式,具有固定的读端和写端. (3)管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的read.w

Linux下多线程编程(C语言)

Linux下多线程编程(C语言) 2.6内核开始使用NPTL(Native POSIX Thread Library)线程库,这个线程库有以下几个目标: POSIX兼容,都处理结果和应用,底启动开销,低链接开销,与Linux Thread应用的二进制兼容,软硬件的可扩展能力,与C++集成等. 这里的线程是指用户空间的线程操作 一.线程相关操作 1.1  pthread_t      pthread_t 在头文件  /usr/include/i386-linux-gnu/bits/pthreadt

Linux下多进程编程(C语言)

Linux下多进程编程(C语言) 一.    进程简介 1.进程是程序的执行.程序是静态的,进程是动态的. 2.进程在内存中有三部分组成:数据段.堆栈段和代码段.          代码段:就是存放程序代码的数据,如果有数个进程运行同一个一个程序,那么它们就可以使用同一个代码段(代码段是可以共享的):          堆栈段:存放的是子程序的返回地址.参数以及程序的局部变量,主要是保存进程的执行的环境,这里用到了栈先进后出的特性,可以看做具有记忆上一次执行的环境.          数据段:存

Linux下网络编程read,write问题(C语言),求大神指点阿!!!

问题描述 Linux下网络编程read,write问题(C语言),求大神指点阿!!! zuijzuj.最近学习socket编程的时候调试代码出现了一些问题,求大神们指导阿!!!我要实现的功能是客户端输入两个操作数和一个运算符,在服务端进行运算再把结果返回到客户端.现在的bug是客户端输入第一个操作数的时候没问题,输入运算符的时候客户端可以通过write函数写入但是服务端读出的结果不是输入的运算符,客户端输入第二个操作数的时候write函数无法写入,这是缓冲区满了吗?缓冲区大小不是由内核自己决定的

Linux下Shell编程快捷键大全(日常整理)_linux shell

有时候,我们需要在 Bash 中重复执行先前的命令.你当然可以使用上方向键来查看之前曾经运行过的命令.但这里有一些更好的方式,例如,数量掌握以下的快捷键. 1) !!:重复执行上一条指令 2) !a:重复执行上一条以a为首的指令 3) !number:重复执行上一条在history表中记录号码为number的指令 4) !-number:重复执行前第number条指令 5) !$:表示获得上一条命令中的最后一项内容 6) 用Ctrl + r 组合键来进入历史搜索模式在history表中查询某条过

Linux下c++编程中,STL模板的使用。

问题描述 Linux下c++编程中,STL模板的使用. Linux下c++编程,使用STL模板,为什么只识别#include 而不识别#include ? 程序中只要有#include 就会报无数多个错! 解决方案 难道c++标准模板库STL中没有包含queue,你可以去根目录去看看include头文件中有没有queue.h 解决方案二: STL头文件目录是否被include进项目中,如果自己写makefile的话,查看下INCLUDE的目录,如果IDE的话就查看下项目设置中的include选项

linux下串口编程read函数返回(非超时返回)问题

问题描述 linux下串口编程read函数返回(非超时返回)问题 串口编程经典应用场景:打开串口,阻塞模式,非超时返回,有数据返回,无数据死等. 简易代码为例: void* read_thread(void* param) { char szbuf[128]; int size = 0; while (running) { size = read(fd, szbuf, sizeof(szbuf)); } return 0; } int main() { fd = open(port, O_RDW

Linux 下Socket编程基础

1. 引言Linux的兴起可以说是Internet创造的一个奇迹.Linux作为一个完全开放其原代码的免费的自由软件,兼容了各种UNIX标准(如POSIX.UNIX System V 和 BSD UNIX 等)的多用户.多任务的具有复杂内核的操作系统.在中国,随着Internet的普及,一批主要以高等院校的学生和ISP的技术人员组成的Linux爱好者队伍已经蓬勃成长起来.越来越多的编程爱好者也逐渐酷爱上这个优秀的自由软件.本文介绍了Linux下Socket的基本概念和函数调用. 2. 什么是So

Linux下C编程:信号处理潜在危险

信号作为异步进程的通信方式,在实际应用中是方便而实用的.但是,也应该注意到在使用信号时的潜在危险.在此简单介绍几种可能引发错误的具体情况,希望在实际进行信号处理时特别注意. 当注册了一个信号处理函数时,可能会对某些系统调用进行修改.通常来讲,它们本来应是不受信号的影响,但由于注册了一个信号处理函数,系统可能会认为在一个信号到来时需要中断原系统调用.当这种情况发生时,原系统调用被终止,返回调用失败值,同时errno将被设置为EINTR.当然有一些时候,确实希望系统如此处理,但在另一些情况下,并不希