1.程序的三種狀態
1.執行。要麼在被cpu執行,要麼等待被執行且最終會被核心排程。
2.停止。執行被掛起且不會被排程。收到特定訊號後才能繼續執行。
3.終止。程序永遠地停止了。可能的原因有三種:(1)收到終止程序的訊號,(2)從主程式返回,(3)呼叫exit函式
2.終止程序
#includevoid exit(int status);//這個大家都很熟悉
3.建立程序
父程序通過fork函式建立乙個新的執行的子程序:(fork英文意為分岔、餐叉,這裡意思應該是從乙個程序中分出來了乙個子程序),新建立的子程序將得到父程序幾乎所有資訊的乙個副本,二者之間最大的區別在於他們有不同的pid。
#include#inlcudepid_t fork(void);
//子程序返回值為0,父程序返回子程序的pid,如果出錯,則返回-1
例如對於fork函式,使用乙個名為fork的包裝函式:
pid_t fork(void)
//可見fork函式的引數型別、返回型別均與fork相同,故呼叫方式也是一樣的
//unix_error的定義
void unix_error(char *msg)
下面就是fork的具體應用:
分為三個檔案,alluse.h(標頭檔案),alluse.c(包裝函式的定義),fork.c(使用)
#ifndef alluse_h
#define alluse_h
#include#includevoid unix_error(char *msg);
pid_t fork(void);
#endif
#include"alluse.h"
#include#include#include#include#include#includevoid unix_error(char *msg)
pid_t fork(void)
#include"alluse.h"
#include#include#include#includeint main()
printf("parent: x=%d\n",--x);
printf("pid: %d\n",getpid());
printf("ppid: %d\n",getppid());
exit(0);
}
編譯執行:
linux> gcc -o forktry fork.c alluse.c
linux> ./forktry
#結果如下
linux> ./forktry
return value of function fork() = 9578
parent: x=0
pid: 9577
ppid: 24176
linux> return value of function fork() = 0
child : x=2
pid: 9578
ppid: 1
由輸出結果可以得到下表:
程序程序pid
父程序ppid
fork返回值
呼叫fork的程序
9577
24176
9578
fork建立的程序
957810
中得到的ppid24176相同,並且fork的返回值也是另乙個程序的pid。唯一讓我有些困惑的就是fork得到的程序的ppid是1而不是呼叫程序的pid,在網上查了下發現可以使用top命令檢視程序資訊,pid=1的程序是systemd,同時也驚喜地發現pid=24176程序就是之前猜測的bash。
TCP建立和終止
本文參考了 unix網路程式設計 主要內容分為以下兩部分 1 tcp客戶端和伺服器一些典型事件概述 2 tcp連線的建立和終止 1 1.1 tcp客戶端和伺服器一些典型事件時間表如下 connect函式出錯時主要有以下幾種情況 1 tcp客戶未收到syn分節的響應,返回etimedout 2 對客戶...
TCP的建立和終止
先看看tcp的狀態變遷圖 tcp ip詳解上面的原圖,來自google 下面就圖中涉及到的問題做一些說明。下面是tcp連線建立與終止的時候的時序圖 在tcp ip協議中,tcp協議提供可靠的連線服務,採用三次握手建立乙個連線 1 第一次握手 建立連線時,客戶端a傳送syn包 syn j 到伺服器b,...
Linux系統呼叫 程序的終止
之前介紹了linux的系統建立,主要是fork 函式和vfork 函式,現在再看看linux程序的終止,主要的呼叫是 exit 和exit 先看看兩個函式的原型以及各自屬於的標頭檔案,可以發現這兩個方法的區別 exit 函式 include void exit int status 從 exit 的...