`
kongweile
  • 浏览: 517516 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

linux中waitpid及wait的用法

 
阅读更多

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函数实例.pdf

    在Linux系统编程中,进程控制是一项基础且重要的任务。`waitpid`函数是用于等待子进程结束的一个关键接口,它允许父...在学习和实践中,深入理解`waitpid`的工作原理和使用方法,对于提升Linux系统编程能力至关重要。

    TIME_WAIT.rar_C-means_linux 网络状态_linux c wait_tcp_unix 网络编程

    在TCP连接的管理中,`linux_c_wait`可能是指在C程序中如何处理等待操作,比如wait()和waitpid()函数,用于等待子进程结束。不过在上下文中,更有可能是指如何在C代码中处理TCP连接的TIME_WAIT状态。 `tcp unix_网络...

    linuxwait与waitpid函数的深入分析[参考].pdf

    Linux中的`wait`和`waitpid`是两个用于管理子进程状态的重要系统调用,它们在多进程编程中扮演着关键角色。本文将对这两个函数进行深入分析。 ### `wait`函数 `wait`函数的基本原型如下: ```c pid_t wait(int *...

    Linux僵死进程的产生与避免.pdf

    Linux 操作系统中,僵死进程(Zombie Process)是一种特殊的进程状态,它是指一个进程已经终止,但是其父进程没有通过wait或waitpid函数来回收它的状态信息,而使得进程所占用的资源无法释放,导致系统资源的浪费。...

    Linux System Programming 中英版 PDF 第二版

    1. **进程管理**:如何创建、控制和管理进程,包括fork、execve、wait和waitpid等系统调用的使用,以及进程间通信(IPC)的各种机制,如管道、消息队列、共享内存和套接字。 2. **线程同步**:线程的概念、创建与...

    linux C常用函数用法有例子

    - `wait()`, `waitpid()`: 等待子进程结束。 - `exit()`: 终止进程并返回状态码。 7. **信号处理函数**: - `signal()`: 注册信号处理器。 - `raise()`: 发送一个信号到当前进程。 8. **文件描述符操作**: -...

    Linux内核API完全参考手册 第2版

    《Linux内核API完全参考手册 第2版》是Linux开发者和系统工程师的宝贵资源,它详细阐述了Linux内核中的各种API接口及其用法。这本书深入浅出地讲解了如何利用这些API进行驱动开发和网络编程,对于想要深入了解Linux...

    Linux/C/C++函数中文使用手册

    C/C++在Linux下可以使用`fork`, `exec`, `wait`, `waitpid`等函数创建、执行和管理子进程。`pipe`和`socket`用于创建管道和套接字,实现进程间的通信。 9. **C/C++中文函数手册**: 提供的三个.chm文件——`...

    Linux环境高级编程

    本书会详细讲解如何创建、控制和管理进程,包括fork()用于创建新进程,exec()家族函数用于替换当前进程的映像,以及wait()和waitpid()用于等待子进程结束。此外,还涉及到进程间的通信机制,如管道、FIFO、共享内存...

    linux系统编程_linux系统编程-中文_

    系统调用是Linux编程的核心,比如`fork()`用于创建新进程,`exec()`系列函数用于替换当前进程的执行体,`wait()`和`waitpid()`用于等待子进程结束,`open()`、`read()`和`write()`用于文件操作,`close()`用于关闭...

    Linux进程编程技术.doc

    僵尸进程可以使用 wait 函数和waitpid 函数来避免,例如使用 wait 函数等待子进程结束,或者使用 waitpid 函数等待指定进程结束。 7. 守护进程的实现 守护进程的实现需要使用特殊的函数和系统调用,例如 fork 函数...

    linux-sys.zh 邢文鹏课件

    7. 进程管理:进程是操作系统的核心概念之一,包括进程环境、进程状态、进程原语(如fork、exec族、wait/waitpid)以及进程间通信机制(如管道、有名管道、内存共享映射、信号等)。 8. 信号处理:信号是进程间通信...

    linux系统编程.rar

    在Linux中,进程是执行中的程序实例,通过fork()创建新进程,exec()加载新的程序,而wait()和waitpid()用于等待子进程结束。此外,还有进程间通信(IPC)机制,如管道、消息队列、共享内存和套接字等。 文件系统是...

    Linux应用编程的学习.pdf

    同时,还包括了进程管理、进程控制编程的知识,如fork、exec函数族、wait和waitpid函数等。 进程间通信章节介绍了多种进程间通信的方式,包括管道、有名管道、信号、共享内存和消息队列等,并提供了相应的编程示例...

    linux程序设计(第三版)

    网络编程是现代应用程序中常见的需求,本书会讲解如何使用socket API进行TCP/IP通信,包括`socket()`, `bind()`, `listen()`, `accept()`, `connect()`, `send()`, `recv()`等函数的用法。同时,还会讨论套接字选项...

    linux进程控制详解及演示代码

    我们将关注《Linux进程编程介绍.pdf》这份文档,它可能涵盖了以下内容:进程的创建与管理(`fork()`, `execve()`等),进程状态(运行、就绪、睡眠等),进程标识符(PID, TID等),以及如何使用`wait()`和`waitpid...

    Linux系统分析与高级编程技术

    了解这些工具的使用方法和分析结果的解读是系统分析师的基本功。 接下来,我们深入到Linux的高级编程技术。Linux系统编程主要涉及系统调用、文件I/O、进程管理、网络编程等。系统调用是用户空间程序与内核交互的...

    Linux API速查手册_linuxapi_

    Linux API速查手册作为开发者的重要工具,详尽地列举了各种API的使用方法、参数、返回值以及可能的错误情况。它不仅可以帮助初学者快速理解Linux编程的基本概念,也为经验丰富的开发者提供了便利的参考,提高开发...

    linux程序设计(第三版)及习题答案

    fork()用于创建一个子进程,而wait()和waitpid()用于父进程等待子进程结束。信号(signal)是一种异步通信机制,用于进程间的同步和异常处理。 文件I/O章节讲解了Linux下的文件系统和文件操作,如open()、close()、...

    Advanced Linux Programing

    书中会详细介绍这些库的使用方法。 通过学习《高级Linux编程》,开发者可以掌握Linux系统级别的编程技巧,为编写高效、稳定的系统级软件打下坚实基础。无论是系统管理员、嵌入式开发人员还是服务器端应用开发者,都...

Global site tag (gtag.js) - Google Analytics