Linux系統呼叫 建立和終止程序

2022-08-30 23:12:19 字數 1986 閱讀 5247

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 的...