【Linux】进程等待&程序替换

进程等待:wait、waitpid

    一个进程在终止时会关闭所有的文件描述符,释放在用户空间分配的内存,但它的PCB还保留着,且内核中还保存着一些信息。如果是正常终止,则保存着退出状态;如果是异常终止,则保存着导致该进程终止信号。这个进程的父进程可以调用wait和waitpid获取这些信息,然后彻底清除这个进程。

等待目的-- 1)为了让父进程读取到子进程退出状态信息(输出型参数status)。
                   2)让系统释放子进程占有的僵尸状态的资源。
                   3)保证子进程先退出,父进程最后退出。(父子进程退出同步、有顺序)
等待方式--阻塞、非阻塞、异步
1.wait


子进程运行结束,父进程等到子进程的退出码,父进程退出。

2.waitpid


进程退出的三种情况:

(1)进程运行完,结果正确  (2)进程运行完,结果错误          (3)进程代码没有运行完,结果未知。

当一个进程正常或异常终止时,内核就向其父进程发送一个SIGCHLD信号。
进程是否正常运行:exit( )---0-正常  非零-异常<即退出码(0-255)>
低八位-status&0xff <信号编号 (子进程是否跑完) 0-没发送信号>  次低八位-(status>>8)&0xff<退出码>;

3.非阻塞等待


子进程一直循环,不退出,父进程也不能退出。


进程的程序替换 execv:

子进程不执行父进程的任何代码,执行其他程序(ls)(用 ls code,ls data)
1)exec的6种函数:
#incldue<unistd.h>
        int execl(const char* path,const char* arg,....);
        int execlp(const char* file,const char* arg,....);
        int execle(const char* path,const char* arg,..., char* const emp[]);
        int execv(const char* path,char* const argv[]);
        int execp(const char* file,char* const argv[]);
        int execve(const char* path,char* const argv[],char* const emp[]);
2)函数的一些规则:
函数名exec:带上p--二进制文件不带路径,否则要path; 包含e--允许传递函数变量表envp[ ];
            l--参数是可变参数列表;v--参数是argv[ ]向量表统一传参;

3)函数的应用:

在子进程中添加execl函数



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值