参数options的值有以下几种类型:
如果使用了WNOHANG参数,即使没有子进程退出,它也会立即返回,不会像wait那样永远等下去.
如果使用了WUNTRACED参数,则子进程进入暂停则马上返回,但结束状态不予以理会.
如果我们不想使用它们,也可以把options设为0,如:ret=waitpid(-1,NULL,0);
WNOHANG使用
#include <sys/types.h>
#include <sys/uio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
pid_t cid;
int pr, status;
cid = fork();
if (cid < 0) {
perror("子进程创建失败!");
} else {
if (cid == 0) {
printf("子进程工作PID=%d\n", getpid());
sleep(5);
exit(3);
} else {
do{
pr = waitpid(0,&status, WNOHANG);
if(pr==0)
{
printf("没有子进程退出,继续执行..\n");
sleep(1);
}
}while(pr==0);
printf("子进程正常退出PID=%d\n", pr);
}
}
return 0;
}
控制台输出:
没有子进程退出,继续执行..
子进程工作PID=3632
没有子进程退出,继续执行..
没有子进程退出,继续执行..
没有子进程退出,继续执行..
没有子进程退出,继续执行..
子进程正常退出PID=3632
针对某一进程进行等待
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
pid_t cid;
int pr, status;
cid = fork();
if (cid < 0) {
perror("子进程创建失败!");
} else {
if (cid == 0) {
printf("子进程工作PID=%d,PPID=%d\n", getpid(), getppid());
sleep(20);
exit(3);
} else {
pr = waitpid(cid, &status, 0);
printf("父进程正常退出PID=%d\n", pr);
}
}
return 0;
}
控制台输出
子进程工作PID=4257,PPID=4252
父进程正常退出PID=4257
WUNTRACED 使用
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
pid_t cid;
int pr, status;
cid = fork();
if (cid < 0) {
perror("子进程创建失败!");
} else {
if (cid == 0) {
printf("子进程工作PID=%d,PPID=%d\n", getpid(), getppid());
sleep(30);
exit(3);
} else {
pr = waitpid(cid, &status, WUNTRACED);
printf("父进程正常退出PID=%d,status=%d\n", pr,status);
}
}
return 0;
}
作法:在子进程SLEEP时,通过SHELL命令停止子进程
[root@ ~ 6$] kill -STOP PID
控制台输出
子进程工作PID=4110,PPID=4108
(SLEEP期间,停止子进程)
父进程正常退出PID=4110,status=4991
在查看进程状态,发现此时父进程子进程都已经退出
[root@ Debug 13$] ps -C Process -opid,ppid,stat,cmd
PID PPID STAT CMD
exec系统调用
函数作用:以新进程代替原有进程,但PID保持不变
形式:
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 envp[]);
int execv(const char *path, char *constargv[]);
int execvp(const char *file, char *constargv[]);
int execve(const char *path, char *constargv[], char *const envp[]);
举例: