程序同步:一組併發的程序按照一定的順序執行的過程稱為程序間的同步。
獲取id:
#include
pid_t getpid(void) //獲取本程序id
pid_t getppid(void) //在子程序中獲取父程序id
程序建立:
#include
pid_t fork(void)
fork()的奇妙之處在於它被呼叫一次,卻返回兩次,它可能有三種不同的返回值:
1. 在父程序中,返回新建立的子程序的pid
2. 在子程序中,返回0
3. 如果出現錯誤,返回乙個負值。
#include
pid_t vfork(void)
fork與vfork的區別:
1.fork:子程序拷貝父程序的資料段
vfork:子程序與父程序共享資料段
2.fork:父、子程序的執行次序不確定
vfork:子程序先執行退出後,父程序再執行。
exec
函式族:
exec用被執行的程式替換呼叫它的程式。與fork的區別:
fork建立乙個新的程序,產生乙個新的pid
exec啟動乙個新程式,替換原有的程序,因此程序的pid不會改變。
看**:
#include
#include
int main(void)
程式/mnt/hgfs/share/program/process/getpid就是列印出子程序和父程序的pid。
$ #./execl
pid in main is 3724
pid=3724
ppid=3432
$# ps
pid tty time cmd
3432 pts/1 00:00:00 bash
3725 pts/1 00:00:00 ps
分析:可以看到我們的execl程式的程序id與getpid的程序id是一樣的。而且他們的父程序都是shell命令。注意當getpid程式退出時,整個程式就退出了,所以後面的兩個輸出語句並沒有執行。
#include
int
execl(const char *path,const char *arg1,...)
引數:path:被執行的程式名(含完整路徑)
arg1—argn:被執行程式所需的命令列引數,含程式名。以空指標
(null)
結束。#include
int
execlp(const char *path,const char *arg1,...)
path:被執行程式名(不含路徑,將從path
環境變數中查詢給程式)
arg1—argn:與上面的相同。
#include
int
execv(const char *path,char * const argv)
引數:path:被執行程式名(含完整路徑)
argv:被執行程式所需的命令列引數陣列(包括null).argv
是指標陣列
**:
#include#include#includeint main(void)
;scanf("%d",&sel);
switch(sel)
}
#include
int
system(const char *string)
功能:呼叫fork產生子程序,由子程序通過exec來執行/bin/sh –c string來執行string所代表的命令。注意:這時在exec函式中,/bin/sh相當於程式名,而string為其引數。所以string命令的父程序是system。
**:
#include#includeint main(void)
#./system
pid in main:31192
ppid in main:3432
pid=31193
ppid=31192
test
可以看到getpid這條命令的父程序就是main程序。system就是乙個系統呼叫,在system函式後面的**必須等到呼叫所建立的子程序返回後才繼續執行。其實在system的實現中其依次呼叫了fork,exec,waitpid。
程序等待:
#include
pid_t
wait(int *staloc);
pid_t
waitpid(pid_t pid,int *staloc,int options);
呼叫wait或waitpid的程序可能:
1. 如果其所有子程序都還在執行,則阻塞。
2. 如果乙個子程序已終止,正等待父程序獲取其終止狀態,則取得該子程序的終止狀態立即返回。
3. 如果它沒有任何子程序,則立即出錯返回。
其實,可以把wait函式理解為就是獲取乙個子程序的終止狀態,終止狀態存在staloc儲存單元中。
waitpid中pid引數的作用解釋如下:
pid == -1 等待任一子程序。與wait等效。
pid >0 等待其程序id與pid相等的子程序。
pid =00 等待其組id等於呼叫程序組id的任一子程序。
pid <-1 等待其組
id等於
pid絕對值的任一子程序。
Linux應用程式設計之程序程式設計
程序同步 一組併發的程序按照一定的順序執行的過程稱為程序間的同步。獲取id include pid t getpid void 獲取本程序id pid t getppid void 在子程序中獲取父程序id 程序建立 include pid t fork void fork 的奇妙之處在於它被呼叫一...
Linux應用程式設計 程序通訊
通訊方式有管道pipe,訊號 一 pipe 管道分兩種無名管道,有名管道。1 無名管道 父程序和子程序可通過無名管道傳輸資料,管道有兩個口,一端寫一端讀,半雙工通訊。可以當作檔案進行操作,所以建立的管道會有兩個檔案描述符fds 0 和fds 1 fds 0 用於讀,fds 1 用於寫,關係如圖。實驗...
Linux串列埠應用程式設計
常見的資料通訊的基本方式可分為並行通訊與序列通訊兩種。1.並行通訊是指利用多條資料傳輸線將乙個字資料的各位元位同時傳送。它的特點是傳輸速度快,適用於傳輸距離短且傳輸速度較高的通訊。2.序列通訊是指利用一條傳輸線將資料以位元位為單位順序傳送。特點是通訊 線路簡單,利用簡單的線纜就可實現通訊,降低成本,...