进程控制相关系统调用(3)


参数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[]);

举例:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/18649.html