常用操作
- 获取和设置进程标识
- 创建一个子进程
- 清理退出的子进程资源
- 执行一个新程序
对应函数
获取和设置进程标识
设置进程用户ID或组ID时,只能由特权用户权限向非特权用户权限进行设置。一般用于限制用户的操作权限。
- 获取进程号
//获取本进程号
pid_t getpid(void);
//获取父进程号
pid_t getppid(void);
- 获取进程标识
//获取进程实际用户ID
uid_t getuid(void);
//获取有效用户ID
uid_t geteuid(void);
//获取进程实际组ID
gid_t getgid(void);
//获取进程有效组ID
gid_t getegid(void);
- 设置进程标识
//设置进程实际用户ID
int setuid(uid_t uid);
//设置进程实际组ID
int setgid(gid_t gid);
//设置进程有效用户用户ID
int seteuid(uid);
//设进程有效用户组ID
int setegid(gid_t gid);
//交换实际用户ID与有效用户ID的值
int setreuid(uid_t ruid, uid_t euid);
int setregid(gid_t rgid, gid_t egid);
创建一个子进程
- 创建子进程函数
pid_t fork(void);
pid_t vfork(void);
返回 0的是子进程;
返回 >0 的是父进程,返回值是子进程pid
返回 <0 表示执行失败
创建新进程的目的是为了执行另一个程序,所以会很快调用exec系列(下文介绍)的函数。如果是执行相关联的任务一般是创建线程(以后的文章会写到)。
这两个函数的区别:
1. fork创建子进程后不确定父进程和子进程那个先运行。
2. vfork创建子进程后确定让子进程先运行,当子进程之后execl后父进程再开始运行。
- 子进程从父进程复制的内容
a. 实际用户ID,实际组ID,有效用户ID,有效组ID,
b. 附属组,进程组ID,会话ID
c. 控制终端,当前工作目录,根目录,
d. 信号屏蔽和信号处理函数
e. 文件描述符,环境变量
f. 资源限制 - 子进程与父进程不同的标识
a. 进程ID
b. 文件锁
c. 未处理闹钟被清除
d. 未处理信号集设置为空
清理退出的子进程资源
- wait
pid_t wait(int *status);
成功:返回终止进程pid; 失败:返回-1
执行wait()函数后,程序会一直阻塞等待一个子进程的状态改变。
- waitpid
pid_t waitpid(pid_t pid, int *status, int option);
成功:返回终止进程pid;失败:返回-1;option为WNOHANG时可返回0
参数 pid:
pid == -1 等待任意子进程,与wait一致
pid > 0 等待进程ID为pid的子进程
pid == 0 等待进程组ID的任意子进程
pid < 0 等待组ID为pid的绝对值的任意子进程
参数 option:
WNOHANG 不阻塞,未收到子进程的终止状态返回0
0 不设置
- 进程终止状态操作宏
WIFEXETED(status) 正常终止则为真
WEXETSTATUS(status) 获取进程退出返回参数的低8位
WIFSIGNALED(status) 被信号终止则为真
WTERMSIG(status) 获取终止进程的信号的编号
WCOREDUMP(status) 终止进程已产生core文件则为真
WIFSTOPED(status) 子进程暂停则为真
WSTOPDIG(status) 获取使进程暂停的信号的编号
WIFCONTINUED(status) 子进程继续运行则为真
执行一个新程序
- 函数
extern char **environ;
int execl(const char *path, const char *arg, ... /* (char *) NULL */);
int execlp(const char *file, const char *arg, ... /* (char *) NULL */);
int execle(const char *path, const char *arg, ... /*, (char *) NULL, char * const envp[] */);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);
- 新程序继承原来程序的资源
a. 进程ID和父进程ID
b. 附属组ID,进程组ID,会话ID
c. 控制终端,根目录,当前工作目录
d. 闹钟,信号屏蔽,未处理信号
e. 文件锁,
f. 资源限制
6万+

被折叠的 条评论
为什么被折叠?



