APUE学习笔记:第八章 进程控制

1、进程标识符,ID为0的进程是调度进程,也称交换进程swapper,是内核的一部分,
而ID为1的则为init进程,获取进程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);

2、fork函数
#include <unistd.h>
pid_t fork(void);
调用一次,返回两次,在父进程中返回子进程ID,在子进程中返回0,出错
则返回-1。fork之后,父子进程的执行顺序是不确定的,存在竞争条件。
父子进程之间存在的最大竞争情况是,文件共享,即子进程会复制父进程打开的
文件句柄,并且副本与原父进程中的句柄共享一个文件表项,共享文件偏移量。
解决该问题有两种方案:
(1)父进程等待子进程先执行完毕(退出时注意调用_exit函数,而不是exit
     函数,否则会冲洗父进程中的文件句柄)
(2)父子进程各自执行不同的程序段


3、vfork函数
与fork的不同点:
(1)保证子进程先于父进程运行
(2)在子进程调用exec或exit之前,它会在父进程的空间中运行

4、进程终止过程
一个进程终止时,内核逐个检查所于活动进程,以判断它是否是正要终止进程的
子进程,如果是,则将该进程的父进程ID更改为1(init的ID),这样保证每个
进程都有一个父进程。

5、僵死进程
内核在一个子进程终止时,会保存该进程的一些信息,如终止状态等。处于这种
状态,且其父进程还没有对其进行善后处理(获取这些信息和释放它仍占用的资源),
的子进程就被称为僵死进程(zombie),ps状态为Z。

6、wait和waitpid
#include <sys/wait.h>
pid_t wait(int *statloc);
pid_t waitpid(pid_t pid, int *statloc, int options);
子进程终止时,会向父进程发送SIGCHLD信号。
由参数statloc返回的值可以使用宏WIFEXITED、WIFSIGNALED、WIFSTOPPED、WIFCONTINUED
来解析,statloc也可以为空指针。
对于wait,如下:
(1)如果所有子进程均还在运行,则阻塞
(2)如果某个子进程终止,正等待父进程获取其状态,则获取后立即返回
(3)如果没有子进程,则立即出错返回
对于waitpid,如下:
(1)pid==-1,等待任一子进程
(2)pid>0,等待进程ID与pid相等的子进程
(3)pid==0,等待其组ID等于调用进程组ID的任一子进程
(4)pid<-1,等待其组ID等于pid绝对值的任一子进程
options参数可以为WCONTINUED、WUNTRACED、WNOHANG,前两个为作业控制时使用,而WNOHANG
则指定如果没有已经终止的子进程,则不阻塞。

7、exec函数
#include <unistd.h>
int execl(const char *parthname, const char *arg0, ... /* (char*)0 */);
int execv(const char *parthname, char *const argv[]);
int execle(const char *parthname, const char *arg0, ... /* (char*)0, char *const envp[] */);
int execve(const char *parthname, char *const argv[], char *const envp[]);
int execlp(const char *filename, const char *arg0, ... /* (char*)0 */);
int execvp(const char *filename, char *const argv[], ... /* (char*)0 */);
函数名中l代表列表、v代表向量(数组),e代表环境变量,p代表从PATH路径搜寻。
pathname参数指定可执行文件的绝对路径,filename指定可执行文件的文件名,可以带路径,
从PATH环境变量中搜旬。

8、system函数
#include <stdlib.h>
int system(const char *cmdstring);

9、getlogin函数
#include <unistd.h>
char *getlogin(void);
获取用户的登陆名,该函数必须要有终端相连才行,守护进程等调用会失败。

你可能感兴趣的:(APUE学习笔记:第八章 进程控制)