APUE 学习笔记(六) 进程控制

1. fork 创建新进程

fork创建的新进程称为子进程,fork函数调用一次,返回两次。
两次返回的唯一区别就是子进程的返回值是0,而父进程的返回值是新子进程的进程ID
在fork之后是父进程先执行还是子进程先执行是不确定的,这取决于内核的调度算法
 
fork的一个特性就是父进程的所有打开文件描述符都被复制到子进程中,父子进程的每个相同的打开描述符共享一个文件表项
 
在fork之后处理文件描述符有两种常见情况:
(1)父进程等待子进程完成。在这种情况下,父进程无需对其描述符做任何处理,因为子进程读写共享描述符的文件偏移量已经执行了相应更新
(2)父子进程各自执行不同的程序段。在这种情况下,在fork之后,父子进程各自关闭它们不需要使用的文件描述符,常见于网络服务进程
 
一个已经终止,但是其父进程尚未对其进行善后处理(获取终止子进程的有关信息,释放它仍占用的资源)的进程被称为 僵死进程
 

2. wait和waitpid函数

当一个进程正常或异常终止时,内核向其父进程发送SIGCHLD信号,子进程终止是异步事件(可以在父进程运行的任何时候发生),这个信号也就是异步通知
调用wait或waitpid时,如果其所有子进程都还在运行,那么调用会阻塞
waitpid函数中,如果pid == -1 那么等待任一子进程,相当于wait函数;如果pid > 0 ,那么等待其进程ID与pid相等的子进程
 

3.exec函数

调用exec并不创建新进程,前后的进程ID并未改变,只是用一个全新的程序替换了当前程序
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
    extern char** environ;
    for (int i = 0; i < argc; ++i) {
        fprintf(stdout, "argv[%d] : %s\n", i, argv[i]);
    }
    for (char** ptr = environ; *ptr != NULL; ++ptr) {
        fprintf(stdout, "%s\n", *ptr);
    }
    return 0;
}

 

4.进程时间

clock_t times(struct tms *buf);
struct tms {
    clock_t tms_utime;    /* user time */
    clock_t tms_stime;    /* system time */
    clock_t tms_cutime;  /* user time of children */
    clock_t tms_cstime;  /* system time of children */
};

 

posted @ 2014-05-07 21:52  skyline09  阅读(210)  评论(0编辑  收藏  举报