linux中wait与waitpid函数使用场景及扩展

简介: linux中wait与waitpid函数使用场景及扩展

一般运用这两个函数,是在父进程等待子进程退出的过程中

区别:wait使调用者阻塞,waitpid有一个选项,可以使调用者不阻塞

status参数是一个整型数指针

非空:子进程退出状态放在它所指向的地址中。

空:不关心退出状态

那么父进程为啥要等待子进程退出?因为子进程退出状态不被收集,就会变成僵尸进程,Linux中用z+显示(英文单词zombie)

wait函数:使调用者阻塞,用来等待子进程退出(后面有附加代码验证)

编译结果:

waitpid函数:可以使调用者不阻塞,则父进程子进程一起运行(后面有附加代码验证)

编译结果:

附加代码验证(wait):

#include <stdio.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
 
 
int main()
{
    pid_t pid;
 
    int cnt = 0;
    int status = 10;
 
    
    pid = fork();
        
    if(pid > 0)
    {
 
        wait(&status);
        printf("child quit, child status = %d\n",WEXITSTATUS(status));
        while(1){
            printf("cnt=%d\n",cnt);
            printf("this is father print, pid = %d\n",getpid());
            sleep(1);
        }    
    }
    
    else if(pid == 0){
        
        while(1){
            printf("this is chilid print, pid = %d\n",getpid());
            sleep(1);
            cnt++;
            if(cnt == 5){
                exit(3);
            }
        }    
    }
 
    return 0;
}

附加代码验证(waitpid):

#include <stdio.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
 
 
int main()
{
    pid_t pid;
 
    int cnt = 0;
    int status = 10;
 
    
    pid = fork();
        
    if(pid > 0)
    {
 
        wait(&status);
        printf("child quit, child status = %d\n",WEXITSTATUS(status));
        while(1){
            printf("cnt=%d\n",cnt);
            printf("this is father print, pid = %d\n",getpid());
            sleep(1);
        }    
    }
    
    else if(pid == 0){
        
        while(1){
            printf("this is chilid print, pid = %d\n",getpid());
            sleep(1);
            cnt++;
            if(cnt == 5){
                exit(3);
            }
        }    
    }
 
    return 0;
}
相关文章
|
7天前
|
缓存 Linux Shell
Linux 内存管理与 Swap 空间扩展实践
该文介绍了Linux系统中`free`命令的使用,解析了其输出信息,包括物理内存(总内存、已用、空闲、缓存)和交换空间(总大小、使用和空闲)。Linux优先使用物理内存作缓存,当内存紧张时使用Swap空间。文章还提供了扩展Swap空间的步骤,并强调适度Swap使用对性能的影响,建议合理平衡物理内存和Swap的比例。
|
12天前
|
Linux C++
Linux C/C++ main函数
Linux C/C++ main函数
|
13天前
|
Ubuntu 中间件 Linux
linux php添加扩展zip libzip ZipArchive功能
linux php添加扩展zip libzip ZipArchive功能
|
1月前
|
Linux
linux中fork函数与vfork函数的区别
linux中fork函数与vfork函数的区别
|
1月前
|
存储 算法 网络协议
【探索Linux】P.26(网络编程套接字基本概念—— socket编程接口 | socket编程接口相关函数详细介绍 )
【探索Linux】P.26(网络编程套接字基本概念—— socket编程接口 | socket编程接口相关函数详细介绍 )
25 0
|
Linux
Linux系统调用二、open()函数与close()函数介绍
Linux系统调用二、open()函数与close()函数介绍
300 0
Linux系统调用二、open()函数与close()函数介绍
|
Linux C++ Unix
|
13小时前
|
安全 Linux Shell
深入探索Linux的login命令
`login`命令是Linux中用户身份验证的关键,用于启动新的会话并访问系统资源。它验证用户名和密码,创建安全的会话,管理权限。主要特点是加密密码、确保身份验证和会话管理。管理员可能使用参数如`-f`, `-h`, `-p`, `-s`进行特殊操作。尽管通常不直接运行login命令,但了解其工作原理和安全最佳实践是重要的,包括使用强密码,定期更改,通过安全协议远程登录,以及谨慎管理会话。
|
13小时前
|
自然语言处理 Linux 数据处理
探索Linux的localedef命令:定义和管理本地化环境
`localedef`是Linux中用于创建和管理本地化环境的命令,它基于输入文件和模板生成二进制的本地化定义,以支持多语言显示和处理。通过参数如 `-i` 指定输入文件,`-f` 指定字符集,`-o` 输出文件路径。在实际应用中,如创建法语(法国)环境,会执行类似 `localedef -i fr_FR -f UTF-8 -c -o /path/to/output fr_FR.UTF-8` 的命令。使用时注意输入文件的准确性、选择合适的字符集,并在操作前备份。查阅文档和社区资源可获取更多帮助。
|
13小时前
|
Linux 数据处理
Linux中的setarch命令:深入探索与实际应用
`setarch`是Linux中用于调整程序执行环境的命令,允许在不同CPU架构或功能标志之间切换,支持跨架构运行二进制文件和测试程序兼容性。它通过设置`PERSONALITY`标志改变指令集解释方式。关键参数包括指定架构(-a)和设置CPU功能标志(-R)。在实际应用中,如需在32位模式下运行64位程序,可以使用`setarch i386 &lt;command&gt;`。使用时注意程序需求、测试验证,避免滥用,并在必要时备份。查阅文档以获取详细信息。