进程相关函数(进程原语)
1.fork
#include <unistd.h>
pid_t fork(void); pid_t 可以看做无符号整形
#include <sys/types.h>
#include <unistd.h>
id_t vfork(void);
成功时,子进程的PID在父进程中返回,子进程中返回0,若失败在父进程中返回 -1,不创建子进程,并且设置errno
由于fork函数有一次调用两次返回的特点,可以利用返回值的不同,使父子进程分别实现不同的功能
在创建子进程时,父进程的所有代码通过映射的方式与子进程共享,只有在子进程进行数据写入时才
会真正为子进程复制,也称"读时共享,写时复制",这样节省了内存空间也减少了复制开销
vfork: 子进程先运行,父进程等到子进程退出或者程序替换后,父进程才会运行,否则同时运行,因为父子进程共用虚拟地址空间,会造成调用栈混乱,因此阻塞父进程,vfork子进程如果return退出,释放资源会使父进程陷入混乱或错误
2.getpid
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void); //返回调用进程的进程ID。(这通常用于生成唯一临时的例程文件名)
pid_t getppid(void); //返回调用进程的父进程的进程ID
3.getuid
#include <unistd.h>
#include <sys/types.h>
uid_t getuid(void); //返回实际用户id
uid_t geteuid(void); //返回有效用户id
4.getgid
#include <unistd.h>
#include <sys/types.h>
gid_t getgid(void); //返回实际用户组id
gid_t getegid(void); //返回有效用户组id
5.exec 族
#include <unistd.h>
extern char **environ;
//在当前路径下找path, 命令, 命令参数, NULL
int execl( const char *path, const char *arg, ...);
//在path环境变量里找file, 命令, 命令参数, NULL
int execlp( const char *file, const char *arg, ...);
//在当前路径下找path, 命令, 命令参数, NULL, envp[] = {环境变量}
int execle( const char *path, const char *arg , ..., char * const envp[]);
//在当前路径下找path, argv[] = {命令, 命令参数..., NULL}
int execv( const char *path, char *const argv[]);
//在path环境变量里找file, argv[] = {命令, 命令参数..., NULL}
int execvp( const char *file, char *const argv[]);
//在设置的环境变量里找filename, 命令, 命令参数, NULL, envp[] = {环境变量}
int execve (const char *filename, char *const argv [], char *const envp[]);
函数如果调用成功则加载新的程序从启动代码开始执行,不再返回,如果失败则返回-1
上,只有execve是真正的系统调用,以上五个函数最终都调用execve,所以execve函数在man手册第2节
其他的函数在man手册第3节
exec函数,第一个参数必须是有效的路径,那么第二个参数就相当于一个占位符,没有意义,但不能删除,第三个参数才是函数真正关心的
6.wait
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);
wait是一个阻塞函数, 调用wait的父进程会一直等待回收子进程资源,如果没有子进程,wait返回-1,之后才会向下执行
wait如果成功返回死亡的子进程的id号,失败返回-1
waitpid是阻塞函数但可以设置为非阻塞, pid设置回收范围, status接受退出值, options选项
waitpid如果成功,返回状态发生改变的子进程id,如果设定了WNOHANG并且有一个或多个进程被指定了pid的回收,但是状态没有改变则返回0
失败返回-1
pid的值为:
< -1 回收指定进程组内的任意子进程
-1 可以回收任何子进程
0 回收和当前调用waitpid一个组的所有子进程
> 0 回收子进程,该子进程的pid是你所设置的pid。
option的值是以下常数的一个或一个或多个:
WNOHANG 如果没有子进程结束,立即返回,非阻塞
WUNTRACED 如果子进程已经停止,则返回
WCONTINUED 如果通过交付SIGCONT恢复了已停止的子进程,则返回