一、相关API
1、进程的创建fork()
#include <unistd.h>
pid_t fork(void);
pid_t vfork(void);
返回值: > 0 父进程 parent process
==0 子进程 child process
< 0(-1) 失败
fork的特点:
第一个特点: 一次调用,两次返回,返回大于0(值就是子进程的id号)表示父进程,等于0表示子进程
子进程会复制父进程的所有资源(代码段,数据段)
第二个特点:父进程总共分成三个部分
第一个部分在fork之前
第二个部分fork成功之后,在id>0情况下的那部分代码
第三个部分fork后面的
总结:
第一点:fork()的套路
if(>0){ 父进程代码 }else if(==0){ 程序员创建子进程需要并发执行的任务代码 }else{ 错误 }
第二点:vfork创建的子进程共享父进程的资源,vfork创建的子进程一定优先于父进程运行
2、进程的退出跟回收exit()/wait()
#include <stdlib.h>
void exit(int status); //退出进程的同时刷新缓冲区
void _exit(int status);//退出进程的时候不刷新缓冲区
参数:status -->进程退出时候的值
对比return: 区别一:return是C语言中关键字,exit()是函数
区别二:return是返回函数调用的结果,exit()是结束整个进程
#include <sys/wait.h>
pid_t wait(int *stat_loc);--->收子进程结束返回值(收尸)
返回值:成功 返回值回收到的那个子进程的ID,失败 -1
参数:stat_loc -->用来存放进程退出时候的状态信息
不是存放退出值,退出值仅仅只是状态信息中的一部分
特点:会让父进程一直阻塞,直到成功回收到子进程为止
pid_t waitpid(pid_t pid, int *stat_loc, int options);
返回值:成功 返回值回收到的那个子进程的ID,失败 -1
参数: pid --> 小于-1 waitpid(-1200,&status,options);回收进程组id是1200的其中一个
等于-1 waitpid(-1,&status,options);回收任意一个子进程(不要求同组)
等于0 waitpid(0,&status,options); 回收本进程组中任意一个子进程
大于0 waitpid(1200,&status,options); 指定回收id是1200的子进程
stat_loc -->跟wait一样
options -->WN0HANG 非阻塞等待,等得到就等,等不到就直接退出
0 阻塞等待
3、获取当前进程的id以及父进程的id
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void); //获取子进程ID
pid_t getppid(void); //获取父进程ID
gid_t getgid(void); //获取进程组ID
4、使用函数执行shell命令
#include <stdlib.h>
#include <unistd.h>
int system(const char *command);
返回值:失败 -1
参数: command -->你要执行的shell命令或者你要执行程序完整的命令名
int execl(const char *path, const char *arg, ...);
参数: path -->你要执行的程序/命令所在的路径
arg