Linux之程序篇

2021-04-09 06:35:21 字數 3084 閱讀 4420

何謂程序?程序就是乙個正在執行著的程式例項。

在linux

中,每乙個程序都有乙個程序號(

process id

)來標示身份。

在shell

中你可以通過

ps命令來檢視。

[liyong@localhost temp]$ ps

pid ttytime

cmd 17197 pts

/800:00:00 bash

31141

pts/800:00:00 ps

關於ps

的詳細用法參考

man手冊。

pid下面的數字就是程序號,比如正在執行的

bash

的程序號是

17197,ps

的程序號是

31141

。程序號是乙個

16位的數字,也就是說,乙個系統中頂多只能由

2^16-1

個程序。

你在程式中可以通過下面函式來獲得程序號。

pid_t getpid()

pid_t pid=getpid();

printf(「%d/n」,(int)pid);

每乙個程序都有其父程序。你在

shell

下直接執行的程序,其父程序就是

bash

。系統中只有乙個程序沒有父程序,就是

init

。它的程序號永遠為

1。所有程序都是

init

程序的子孫程序。

你可以通過下面的函式來獲得其父程序號。

pid_t getppid();

程序可以通過自身的停止執行來結束,也可以通過

kill

命令來殺死。

[liyong@localhost ~]$ ps

pid ttytime cmd

17197 pts

/800:00:00 bash

31213 pts

/800:00:00 find

31220 pts

/800:00:00 ps

[liyong@localhost ~]$ kill 31213

[liyong@localhost ~]$ ps

pid ttytime cmd

17197 pts

/800:00:00 bash

31221 pts

/800:00:00 ps

kill

其實是向程序傳送乙個

sigterm

訊號。下面談一下如何建立乙個程序。

建立乙個程序由兩種常用的方法:

system

和fork/exec family

。system

方法比較低效,通常不用。在這裡重點說明

fork/exec family

用法。使用

fork

來建立乙個新的程序,其實是將程序自身複製成乙個新的程序。記住,是複製,不是共享。你可以通過

fork

函式的返回值來區分該程序是父程序還是子程序。對於父程序,

fork

返回了子程序的

pid。對於子程序而言,

fork返回0

。下面是乙個簡單的

fork

程式。#include

#include

#include

#include

int main()

exit(0); }

else

exit(0);

} }

exec

是一系列函式族。它和

fork

不同的是,他請求執行的程式將代替原先正在執行的程式。該函式執行完後,原先執行的程式將被終止,請求執行的程式開始執行,而程序號不變。

exec

有一系列寒暑,他們區分如下:

l如果名字裡含有

p,比如

execvp

,execlp

,那麼表示他們執行的程式位址就在當前目錄下,而如果沒有,則需要寫出程式的絕對位址。

l如果名字裡有

v,則表示傳遞給即將執行的程式的引數是字串,而如果是

l,則表示引數格式採用的是

c語言裡的變引數。

如果傳遞的引數是字串,需要注意的是該字串內容和在命令列下執行程式時傳遞的引數一樣,也就是說字串從

argv[0]

到argv[argc-1]

。且argv[0]

就是該程式的名字。另外,該字串必須以

null

來結尾。

參考下面乙個程式。

#include

#include

#include

int main()

; int status=0;

pid_t child_pid=fork();

if(child_pid==0)

else }

在這裡,我們先呼叫

fork

複製了乙個子程序,然後再呼叫

execvp

新執行了乙個程式。

在這個程式離我們還呼叫了

wait

函式。該函式有什麼作用了?

在一些情況下,我們的父程序可能比子程序結束的要早。如果父程序提前結束了,子程序就變成了殭屍程序。我們需要父程序來清理子程序結束後的一些環境。在這個時候呼叫

wait

,父程序將阻塞在

wait

地方,等待子程序結束。

wait

函式的引數,在這裡我們輸入的是

status

,將返回子程序結束的返回值,就是

return

的值。如果不需要,可以設為

null

。注意,如果有多個子程序,那麼當只要有乙個程序結束的時候,

wait

函式就會返回。

如果你在父程序中忘記呼叫了

wait

,那麼子程序將變成殭屍程序。由於

init

程序是所有程序的祖宗程序,

init

的乙個職責就是不斷查詢系統,來獲得哪些殭屍程序。它會代替父程序來清理子程序的環境。

Linux之程序篇

何謂程序?程序就是乙個正在執行著的程式例項。在linux中,每乙個程序都有乙個程序號 process id 來標示身份。在shell中你可以通過ps命令來檢視。liyong localhost temp ps pid tty time cmd 17197 pts 8 00 00 00 bash 31...

Linux程序間通訊之共享記憶體篇

共享記憶體 共享記憶體是lunix系統中最底層的通訊機制,也是最快的通訊機制。共享記憶體通過兩個或多個程序共享同一塊記憶體區域來實現程序間的通訊,就如同 malloc 函式向不同程序返回了指向同乙個物理記憶體區域的指標。通常是由乙個程序建立一塊共享記憶體區域,然後多個程序可以對其進行訪問,乙個程序將...

複試篇 Linux 程序管理

1.程式一般是放置在物理磁碟中,通過使用者的執行來觸發,觸發後會載入到記憶體中稱為乙個個體,這就是程序。2.linux程式呼叫的流程 fork and exec 系統先以fork的方式複製乙個與父程序相同的臨時程序,這個程序與父程序唯一的區別就是pid不同,並且多了乙個ppid的引數,然後以exce...