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 */
};
相关文章
相关标签/搜索