您的位置:首页 > 运维架构 > Linux

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

2016-08-21 10:44 543 查看
进程等待: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函数

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息