博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
进程 子进程 关系
阅读量:6910 次
发布时间:2019-06-27

本文共 2355 字,大约阅读时间需要 7 分钟。

父子进程

1. 退出关系

  • 子进程继承了父进程的内容
  • 父子进程有独立的地址空间, 互不影响

    若父进程先结束

    子进程成为孤儿进程,被init进程收养 ——》 子进程变成后台进程
    若子进程先结束 ——》 父进程如果没有及时回收,子进程变成僵尸进程

2. 执行位置

fork 创建了子进程后,子进程从何处执行?

子进程从fork的下一条语句开始执行
父子进程谁先执行?
不确定,看操作系统先调度谁

3. 进程回收函数 —— wait

#include 
pid_t wait(int * status);

成功时返回回收的子进程的进程号;失败时返回EOF

若子进程没有结束,父进程一直阻塞
若有多个子进程,哪个子进程先结束就先回收
(有多少个子进程,就应该有多少个wait)
status 指定保存子进程返回值和结束方式的地址
statusNull, 直接释放子进程PCB,不接收返回值

int void main(int argc, const char * argv[]){    int status;    pid_t pid;        if((pid ==fork()) < 0){        perror("fork");exit(-1);    }else if(0 == pid){        sleep(1);exit(2);    }else{        wait(&status);        printf("%x\n", status);    }}

进程返回值和结束方式

子进程通过exit/_exit/return 返回某个值(0-255)
父进程调用wait(&status)回收
WIFEXITED(status) //判断子进程是否正常结束
WEXITSTATUS(status) 获取子进程返回值
WIFSIGNALEN(status) 判断子进程是否被信号结束
WTERMSIG(status) 获取结束子进程的信号类型

status[15: 0][6:0]为0 表示正常结束      大于0 表示结束子进程的信号类型 [15:8] 子进程返回值

进程回收函数 —— waitpid

#include
pid_t waitpid(pid_t pid, int * status, int option);

成功时返回回收的子进程的pid或0;失败时返回EOF

pid 可用于指定回收哪个子进程或任意子进程
status 制定用于保存子进程返回值和结束方式的地址
option指定回收方式,0或WNOHANG

eg: waitpid(pid, &status, 0);

以阻塞方式回收指定子进程

waitpid(pid, &status, WNOHANG);

以非阻塞方式回收指定子进程(子进程没有结束返回0)

waitpid(-1, &status, 0) 等价于waitwaitpid(-1,&status, WNOHANG);

**进程结束 exit / _exit**

#include 
#include
void exit(int status); stdlib.hvoid _exit(int status);

结束当前的进程并将status 返回

exit结束时会刷新(流)缓冲区


exec函数族

进程调用exec函数族执行某个程序,进程当前内容被指定的程序替换

实现让父子进程执行不同的程序

  1. 父进程创建子进程
  2. 子进程调用exec函数族
  3. 父进程不受影响
    应用举例: shell
#include 
int execl(const char *path, const char * arg, ...);int execlp(const char *file, const char * arg, ...);

成功时执行指定的程序; 失败时返回EOF

path 执行的程序的名称, 包含路径
arg... 传递给执行程序的参数列表
file 执行的程序的名称,在PATH中查找

eg: if(execl("/bin/ls", "ls","-a", "-l", "/etc", NULL )<0){    perror("execl");}if(execlp("ls", "ls","-a", "-l", "/etc", NULL )<0){    perror("execl");}
int execv(const char * path,  char * const argv[] );int execvp(const char * file,  char * const argv[] );//成功时执行指定的程序; 失败时返回EOFeg;char * arg[] = {"ls", "-a", "-l", "/etc",NULL};if(execv("bin/ls", arg) < 0){    perror(execv);}if(execv("ls", arg) < 0){    perror(execvp);}

system

#include 
int system(const char * command);

调用此进程先创建子进程,执行完后返回当前进程

成功时返回command的返回值, 失败时返回EOF
当前进程等待command执行结束后才继续执行

转载于:https://www.cnblogs.com/fengyang66/p/6143013.html

你可能感兴趣的文章
怎么使用阿里云直播服务应用到现在主流直播平台中
查看>>
Ubuntu 安装搜狗拼音及fcitx
查看>>
JS中级 - 03:文档宽高及窗口事件(选)
查看>>
JavaScript类型转换
查看>>
路由器断网如何配置上网
查看>>
Vim保存只读模式下的修改
查看>>
转】Eclipse在线安装SVN
查看>>
Configuration
查看>>
DirectShowNet 使用摄像头录像+录音
查看>>
Oracle、SQL Server、MySQL数据类型对比
查看>>
php开n次方
查看>>
eclipse自动补全的设置
查看>>
Delphi的三目运算 ifthen 和iif
查看>>
libcurl多线程超时设置不安全(转)
查看>>
3种web会话管理的方式
查看>>
Atitit 常用比较复杂的图像滤镜 attilax大总结
查看>>
ife任务刷题总结(一)-css reset与清除浮动
查看>>
JSContext
查看>>
字符识别(模板匹配&BP神经网络训练)
查看>>
【转】iOS 删除已经配置的类库和移除CocoaPods
查看>>