进程控制
主要内容包括:进程创建,进程执行,进程终止。
进程ID
- #include <unistd.h>
- pid_t getpid(void);
- pid_t getppid(void);
- uid_t getuid(void);
- uid_t geteuid(void);
- gid_t getgid(void);
- gid_t getegid(void);
返回相应的ID,关于real user ID和effective user ID
进程创建
- #include <unistd.h>
- pid_t fork(void);
- // returns: 0 in child, process ID of child in parent, -1 on error.
子进程会复制父进程的data space, heap and stack, 与父进程共享text segment.
- fork之后,parent和child之间相同的部分
- > real user ID, real group ID, effective user ID, effective group ID
- > Supplementary group IDs
- > Process group ID
- > Session ID
- > Controlling terminal
- > The set-user-ID and set-group-ID flags
- > current working directory
- > Root directory
- > File mode creation mask
- > Signal mask and dispositions
- > The close-on-exec flag for any open file descriptors
- > Environment
- > Attached shared memory segments
- > memory mappings
- > Resource limits
- 不同的部分
- > The return value from fork
- > The process IDs are different
- > The tow processes have different parent process IDs
- > The child's tms_utime, tms_stime, tms_cutime, tms_cstime值被设为0
- > File locks set by the parent are not inherited by the child
- > Pending alarms are cleared for the child
- > The set of pending signals for the child is set to the empty set
vfork函数
与fork函数类似, 创建子进程. 但子进程与父进程共享空间, 而且vfork保证子进程先开始执行.
exit函数
当一个进程调用exit系列函数, 但该进程的父进程已经结束, 这是init进程成为该进程的父进程. 只有当父进程调用wait系列函数之后, 一个进程才会完全结束, 在此之前该进程为僵尸进程(zombie)
wait系列函数
当进程退出时, 内核通过发送SIGCHLD信号通知其父进程, 父进程可以处理该信号或不处理.
- #include <sys/wait.h>
- pid_t wait(int *statloc);
- pid_t waitpid(pid_t pid, int *statloc, int options);
- pid_t waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);
- #include <sys/types.h>
- #include <sys/wait.h>
- #include <sys/time.h>
- #include <sys/resource.h>
- pid_t wait3(int *statloc, int options, struct rusage *rusage);
- pid_t wait4(pid_t pid, int *statloc, int options, struct rusage *rusage);
进程调用wait或waitpid会产生下面的后果:
i) 阻塞, 如果全部的子进程仍在运行.
ii) 立即返回一个子进程的termination status (注意不是exit status)
iii) 返回错误, 如果没有子进程.
waitpid的pid参数,
pid == -1 : 等待任何子进程
pid > 0 : 等待pid子进程
pid == 0 : 等待任何process group ID与父进程相同的子进程
pid < -1 : 等待任何process group ID与|pid|相同的子进程.
options参数:
WCONTINUED :
WNOHANG : 此时如果子进程未退出, waitpid也不会阻塞
WUNTRACED :
当wait或waitpid正常执行后, statloc指向的对象中包含了子进程的termination status. 利用下面的宏来取得相应的信息.
- WIFEXITED(status) : 如果子进程正常终止,返回True。然后可以调用WEXITSTATUS(status)得到子进程的exit status。
- WIFSIGNALED(status) : 如果子进程因为signal异常终止,返回True,然后调用WTERMSIG(status)得到signal number
- WIFSTOPPED(status) : 如果子进程已经stop,返回True,用WSTOPSIG(status),取得使进程stop的信号。
- WIFCONTINUED(status) : 如果子进程又继续执行,返回True。
exec系列函数
- #include <unistd.h>
- int execl(const char *pathname, const char *arg0, ... /* (char *) 0 */);
- int execv(const char *pathname, char *const argv[]);
- int execle(const char *pathname, char *arg0, ... /* (char *) 0, char *const envp[] */)
- int execve(const char *pathname, char *const argv[], char *const envp[]);
- int execlp(const char *filename, const char *arg0, ... /* (char *) 0 */ );
- int execvp(const char *filename, char *const argv[]);
- l : list arguments
- v : vector arguments
- p : use PATH environment
- e : environment
注意不存在同时指定pe的exec函数.
阅读(1390) | 评论(0) | 转发(1) |