Linux之程序篇

2021-06-04 13:15:28 字數 2435 閱讀 1501

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

在linux中,每乙個程序都有乙個程序號(process id)來標示身份。

在shell中你可以通過ps命令來檢視。

[liyong@localhost temp]$ ps

pid   tty     time   cmd

17197   pts/8    00:00:00  bash

31141   pts/8    00:00:00  ps

關於ps的詳細用法參考man手冊。

pid下面的數字就是程序號,比如正在執行的bash的程序號是17197,ps的程序號是31141。

程序號是乙個16位的數字,也就是說,乙個系統中頂多只能由2^16-1個=65535程序。

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

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 tty          time cmd

17197 pts/8    00:00:00 bash

31213 pts/8    00:00:00 find

31220 pts/8    00:00:00 ps

[liyong@localhost ~]$ kill 31213

[liyong@localhost ~]$ ps

pid tty          time cmd

17197 pts/8    00:00:00 bash

31221 pts/8    00: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 ttytime cmd 17197 pts 800 00 00 bash 3...

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

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

複試篇 Linux 程序管理

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