wait(等待子进程中断或结束)
表头文件
#include<sys/types.h>
#include<sys/wait.h>
定义函数 pid_t wait (int * status);
函数说明:
wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。
如果在调用 wait()时子进程已经结束,则 wait()会立即返回子进程结束状态值。
子进程的结束状态值会由参数 status 返回,而子进程的进程识别码也会一起返回。
如果不在意结束状态值,则参数 status 可以设成 NULL。
子进程的结束状态值请参考 waitpid( )
如果执行成功则返回子进程识别码(PID) ,如果有错误发生则返回返回值-1。失败原因存于 errno 中。
pid_t pid1; int status=0;
i=wait(&status);
i返回的是子进程的识别码;PID
status中存的是子进程的结束状态;可用WEXITSTATUS(status)得到子进程的exit(3)的状态,那么就是3;
waitpid(等待子进程中断或结束)
表头文件
#include<sys/types.h>
#include<sys/wait.h>
定义函数 pid_t waitpid(pid_t pid,int * status,int options);
函数说明:
waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。
如果在调用 wait()时子进程已经结束,则 wait()会立即返回子进程结束状态值。
子进程的结束状态值会由参数 status 返回,而子进程的进程识别码也会一快返回。
如果不在意结束状态值,则参数 status 可以设成 NULL。
参数 pid 为欲等待的子进程识别码,其他数值意义如下:
pid<-1 等待进程组识别码为 pid 绝对值的任何子进程。
pid=-1 等待任何子进程,相当于 wait()。
pid=0 等待进程组识别码与目前进程相同的任何子进程。
pid>0 等待任何子进程识别码为 pid 的子进程。
参数 option 可以为 0 或下面的 OR 组合:
WNOHANG 如果没有任何已经结束的子进程则马上返回, 不予以等待。
WUNTRACED 如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会。
子进程的结束状态返回后存于 status,底下有几个宏可判别结束情况:
WIFEXITED(status)如果子进程正常结束则为非 0 值。
WEXITSTATUS(status)取得子进程 exit()返回的结束代码,一般会先用 WIFEXITED 来判断是否正常结束才能使用此宏。
WIFSIGNALED(status)如果子进程是因为信号而结束则此宏值为真
WTERMSIG(status) 取得子进程因信号而中止的信号代码,一般会先用 WIFSIGNALED 来判断后才使用此宏。
WIFSTOPPED(status) 如果子进程处于暂停执行情况则此宏值为真。一般只有使用 WUNTRACED 时才会有此情况。
WSTOPSIG(status) 取得引发子进程暂停的信号代码,一般会先用 WIFSTOPPED 来判断后才使用此宏。
如果执行成功则返回子进程识别码(PID) ,如果有错误发生则返回返回值-1。失败原因存于 errno 中。
/******
* waitpid.c - Simple wait usage
*********/
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
pid_t childpid;
int status;
childpid = fork();
if ( -1 == childpid )
{
perror( "fork()" );
exit( EXIT_FAILURE );
}
else if ( 0 == childpid )
{
puts( "In child process" );
sleep( 3 );//让子进程睡眠3秒,看看父进程的行为
printf("\tchild pid = %d\n", getpid());
printf("\tchild ppid = %d\n", getppid());
exit(EXIT_SUCCESS);
}
else
{
waitpid( childpid, &status, 0 );
puts( "in parent" );
printf( "\tparent pid = %d\n", getpid() );
printf( "\tparent ppid = %d\n", getppid() );
printf( "\tchild process exited with status %d \n", status );
}
exit(EXIT_SUCCESS);
}
[root@localhost src]# gcc waitpid.c
[root@localhost src]# ./a.out
In child process
child pid = 4469
child ppid = 4468
in parent
parent pid = 4468
parent ppid = 4379
child process exited with status 0
[root@localhost src]#
如果将上面“waitpid( childpid, &status, 0 );”行注释掉,程序执行效果如下:
[root@localhost src]# ./a.out
In child process
in parent
parent pid = 4481
parent ppid = 4379
child process exited with status 1331234400
[root@localhost src]# child pid = 4482
child ppid = 1
子进程还没有退出,父进程已经退出了。
分享到:
相关推荐
在Linux系统编程中,进程控制是一项基础且重要的任务。`waitpid`函数是用于等待子进程结束的一个关键接口,它允许父...在学习和实践中,深入理解`waitpid`的工作原理和使用方法,对于提升Linux系统编程能力至关重要。
在TCP连接的管理中,`linux_c_wait`可能是指在C程序中如何处理等待操作,比如wait()和waitpid()函数,用于等待子进程结束。不过在上下文中,更有可能是指如何在C代码中处理TCP连接的TIME_WAIT状态。 `tcp unix_网络...
Linux中的`wait`和`waitpid`是两个用于管理子进程状态的重要系统调用,它们在多进程编程中扮演着关键角色。本文将对这两个函数进行深入分析。 ### `wait`函数 `wait`函数的基本原型如下: ```c pid_t wait(int *...
Linux 操作系统中,僵死进程(Zombie Process)是一种特殊的进程状态,它是指一个进程已经终止,但是其父进程没有通过wait或waitpid函数来回收它的状态信息,而使得进程所占用的资源无法释放,导致系统资源的浪费。...
1. **进程管理**:如何创建、控制和管理进程,包括fork、execve、wait和waitpid等系统调用的使用,以及进程间通信(IPC)的各种机制,如管道、消息队列、共享内存和套接字。 2. **线程同步**:线程的概念、创建与...
- `wait()`, `waitpid()`: 等待子进程结束。 - `exit()`: 终止进程并返回状态码。 7. **信号处理函数**: - `signal()`: 注册信号处理器。 - `raise()`: 发送一个信号到当前进程。 8. **文件描述符操作**: -...
《Linux内核API完全参考手册 第2版》是Linux开发者和系统工程师的宝贵资源,它详细阐述了Linux内核中的各种API接口及其用法。这本书深入浅出地讲解了如何利用这些API进行驱动开发和网络编程,对于想要深入了解Linux...
C/C++在Linux下可以使用`fork`, `exec`, `wait`, `waitpid`等函数创建、执行和管理子进程。`pipe`和`socket`用于创建管道和套接字,实现进程间的通信。 9. **C/C++中文函数手册**: 提供的三个.chm文件——`...
本书会详细讲解如何创建、控制和管理进程,包括fork()用于创建新进程,exec()家族函数用于替换当前进程的映像,以及wait()和waitpid()用于等待子进程结束。此外,还涉及到进程间的通信机制,如管道、FIFO、共享内存...
系统调用是Linux编程的核心,比如`fork()`用于创建新进程,`exec()`系列函数用于替换当前进程的执行体,`wait()`和`waitpid()`用于等待子进程结束,`open()`、`read()`和`write()`用于文件操作,`close()`用于关闭...
僵尸进程可以使用 wait 函数和waitpid 函数来避免,例如使用 wait 函数等待子进程结束,或者使用 waitpid 函数等待指定进程结束。 7. 守护进程的实现 守护进程的实现需要使用特殊的函数和系统调用,例如 fork 函数...
7. 进程管理:进程是操作系统的核心概念之一,包括进程环境、进程状态、进程原语(如fork、exec族、wait/waitpid)以及进程间通信机制(如管道、有名管道、内存共享映射、信号等)。 8. 信号处理:信号是进程间通信...
在Linux中,进程是执行中的程序实例,通过fork()创建新进程,exec()加载新的程序,而wait()和waitpid()用于等待子进程结束。此外,还有进程间通信(IPC)机制,如管道、消息队列、共享内存和套接字等。 文件系统是...
同时,还包括了进程管理、进程控制编程的知识,如fork、exec函数族、wait和waitpid函数等。 进程间通信章节介绍了多种进程间通信的方式,包括管道、有名管道、信号、共享内存和消息队列等,并提供了相应的编程示例...
网络编程是现代应用程序中常见的需求,本书会讲解如何使用socket API进行TCP/IP通信,包括`socket()`, `bind()`, `listen()`, `accept()`, `connect()`, `send()`, `recv()`等函数的用法。同时,还会讨论套接字选项...
我们将关注《Linux进程编程介绍.pdf》这份文档,它可能涵盖了以下内容:进程的创建与管理(`fork()`, `execve()`等),进程状态(运行、就绪、睡眠等),进程标识符(PID, TID等),以及如何使用`wait()`和`waitpid...
了解这些工具的使用方法和分析结果的解读是系统分析师的基本功。 接下来,我们深入到Linux的高级编程技术。Linux系统编程主要涉及系统调用、文件I/O、进程管理、网络编程等。系统调用是用户空间程序与内核交互的...
Linux API速查手册作为开发者的重要工具,详尽地列举了各种API的使用方法、参数、返回值以及可能的错误情况。它不仅可以帮助初学者快速理解Linux编程的基本概念,也为经验丰富的开发者提供了便利的参考,提高开发...
fork()用于创建一个子进程,而wait()和waitpid()用于父进程等待子进程结束。信号(signal)是一种异步通信机制,用于进程间的同步和异常处理。 文件I/O章节讲解了Linux下的文件系统和文件操作,如open()、close()、...
书中会详细介绍这些库的使用方法。 通过学习《高级Linux编程》,开发者可以掌握Linux系统级别的编程技巧,为编写高效、稳定的系统级软件打下坚实基础。无论是系统管理员、嵌入式开发人员还是服务器端应用开发者,都...