Linux系统编程:进程控制
一、进程相关操作与编程对应函数
1.进程创建:两种方式来实现。
①fork:创建一个子进程,父子进程共享一份代码程序,但是各有一份独立的数据,为了效率和保持数据的独立采用写时复制技术(COW)。运行无优先级。
#include <unistd.h> pid_t fork(void);
返回值:成功——子进程(0),父进程(子进程pid)、失败——(-1)
②vfork:创建一个新进程,子进程复制一份父进程的数据和堆栈空间(COW技术),继承父进程的用户代码、用户组、环境变量、打开的文件等资源,但是子进程不会继承父进程的文件锁定和未处理的信号。子进程优先执行,直到子进程调用exec函数或退出。在调用exec或exit之前,子进程和父进程的数据是共享的。
#include<unistd.h> pid_t vfork(void);
返回值:成功——子进程(0),父进程(子进程pid)、失败——(-1)
2.进程等待
①wait:直到有信号来到或所有子进程结束时父进程才恢复执行。如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值status。
#include<sys/types.h> #include<sys/wait.h> pid_t wait (int * status);
返回值:成功——子进程PID,失败——(-1)
②waitpid:指定等待的进程。
#include<sys/types.h> #include<sys/wait.h> pid_t waitpid(pid_t pid,int * status,int options);
Pid:欲等待的子进程识别码 pid <-1 等待进程组识别码为pid绝对值的任何子进程。 pid =-1 等待任何子进程,相当于wait()。 pid = 0 等待进程组识别码与目前进程相同的任何子进程。 pid > 0 等待任何子进程识别码为pid的子进程 options 通常设置成0
返回值:成功——子进程PID,失败——(-1)
3.执行程序
①exec函数族:在当前的进程中执行任务。
主要函数:execl、execv 、execle 、execve 、execlp 、execvp。函数的主要区别在于参数传递方式的不同。
"l" : list,函数的参数是通过一一列举的方式来传递的 "v" : vector,向量、指针的意思,参数是通过字符数组指针来传递 "e" : environment "p" : PACH,指定文件默认从PATH 环境变量中查找文件并执行