Linux應用程式設計之程序程式設計

2021-07-22 11:40:39 字數 2741 閱讀 6777

程序同步:一組併發的程序按照一定的順序執行的過程稱為程序間的同步。

獲取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.序列通訊是指利用一條傳輸線將資料以位元位為單位順序傳送。特點是通訊 線路簡單,利用簡單的線纜就可實現通訊,降低成本,...