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 */
};
相關文章
相關標籤/搜索