117.info
人生若只如初见

linux中Wait函数和waitpid函数怎么用

在Linux中,wait函数和waitpid函数都是用来等待子进程结束并获取子进程的终止状态的。

wait函数的函数原型如下:

#include 
#include 

pid_t wait(int *status);

wait函数会等待任意一个子进程结束,并将子进程的终止状态保存在status指向的整型变量中。如果不关心子进程的终止状态,可以将status设为NULLwait函数返回被终止子进程的进程ID。

示例代码如下:

#include 
#include 
#include 
#include 
#include 

int main() {
    pid_t pid = fork();
    
    if (pid == -1) {
        perror("fork");
        exit(1);
    } else if (pid == 0) {
        // 子进程执行的代码
        printf("Child process\n");
        sleep(3);
        exit(0);
    } else {
        // 父进程执行的代码
        printf("Parent process\n");
        
        int status;
        pid_t child_pid = wait(&status);
        
        if (WIFEXITED(status)) {
            printf("Child process %d exited normally with status %d\n", child_pid, WEXITSTATUS(status));
        } else {
            printf("Child process %d exited abnormally\n", child_pid);
        }
    }
    
    return 0;
}

输出结果:

Parent process
Child process
Child process 1234 exited normally with status 0

waitpid函数的函数原型如下:

#include 
#include 

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

waitpid函数可以指定等待的子进程ID,其中pid参数有以下几种取值:

  • pid > 0:等待进程ID为pid的子进程;
  • pid = -1:等待任意一个子进程;
  • pid = 0:等待和调用waitpid函数的父进程在同一个进程组的任意子进程;
  • pid < -1:等待进程组ID为-pid的任意子进程。

status参数和wait函数一样,用来保存子进程的终止状态。

options参数用来指定额外的选项,比如可以使用WNOHANG选项来非阻塞地等待子进程结束。

示例代码如下:

#include 
#include 
#include 
#include 
#include 

int main() {
    pid_t pid = fork();
    
    if (pid == -1) {
        perror("fork");
        exit(1);
    } else if (pid == 0) {
        // 子进程执行的代码
        printf("Child process\n");
        sleep(3);
        exit(0);
    } else {
        // 父进程执行的代码
        printf("Parent process\n");
        
        int status;
        pid_t child_pid = waitpid(pid, &status, 0);
        
        if (WIFEXITED(status)) {
            printf("Child process %d exited normally with status %d\n", child_pid, WEXITSTATUS(status));
        } else {
            printf("Child process %d exited abnormally\n", child_pid);
        }
    }
    
    return 0;
}

输出结果和前面的例子是一样的。

未经允许不得转载 » 本文链接:https://www.117.info/ask/fe028AzsLBQFfDFY.html

推荐文章

  • 如何配置LNMP实现负载均衡

    配置LNMP实现负载均衡涉及多个步骤,包括安装和配置Nginx、PHP-FPM、MySQL以及设置负载均衡策略。以下是一个基本的配置指南:
    1. 安装Nginx、PHP-FPM和MySQ...

  • 如何使用yum卸载Linux软件

    要使用yum卸载Linux软件,请按照以下步骤操作: 打开终端:点击左下角的应用程序菜单,找到“终端”并打开它。或者按下快捷键Ctrl + Alt + T。 输入命令:在终端...

  • Linux Kafka集群如何搭建

    搭建Linux Kafka集群需要以下几个步骤:
    1. 环境准备 安装Java:Kafka需要Java运行环境,推荐使用Java 8及以上版本。
    安装Zookeeper:Kafka集群依赖于...

  • Linux文件压缩与解压技巧有哪些

    在Linux系统中,文件压缩和解压是非常常见的操作,掌握这些技巧可以提高工作效率和文件管理的效率。以下是一些常用的压缩与解压技巧:
    常用压缩命令 tar命令...

  • python怎么查看类的所有方法

    要查看类的所有方法,你可以使用dir()函数。dir()函数返回一个指定对象的所有属性和方法的列表。
    例如,假设有一个名为MyClass的类,你可以使用以下代码查看...

  • jvm怎么控制线程堆栈大小

    JVM 可以通过设置以下参数来控制线程堆栈大小: -Xss:该参数用于设置每个线程的堆栈大小。例如,-Xss1m 表示每个线程的堆栈大小为1MB。 -XX:ThreadStackSize:该...

  • Linux设置线程堆栈大小失效怎么解决

    在Linux中,线程堆栈大小通常由操作系统的默认设置控制。然而,有时候我们需要显式地设置线程堆栈大小。
    如果你设置线程堆栈大小后发现失效了,可能是由于以...

  • python列表命名的规则是什么

    Python列表命名的规则与其他变量命名的规则相同。以下是一些常见的规则: 变量名必须以字母或下划线开头。
    变量名只能包含字母、数字和下划线。
    变量名...