linux,linux作業系統
參考:
operatingfocus.bokee.com/3327857.html
www.oschina.net/code/snippet_237505_8646
www.cnblogs.com/techdoc/archive/2010/12/22/1913521.html
一.多進程編程裡常用的函數。
1.pid_t fork();
建立子進程
2.int execl(const char * path,const char * arg,....);
path是可執行檔路徑, 標頭檔#include<unistd.h>,該檔案時傳遞過去的argv(0)、argv[1]……,最後一個參數必須用null 指標(NULL)作結束。
3.int execlp(const char * file,const char * arg,……);
execlp()會從PATH 環境變數所指的目錄中尋找符合參數file的檔案名稱,找到後便執行該檔案。
4.int execv (const char * path, char * const argv[ ]);
path是檔案路徑
5.pid_t getpid(void);
getpid()用來取得目前進程的進程識別碼
6.pid_t getppid(void);
getppid()用來取得目前進程的父進程識別碼。
7.void setsid(void);
如 果調用此函數的進程不是一個進程組的組長,則此函數就會建立一個新會話,該進程變成會話的首進程,然後該進程成為一個新進程組的組長進程,該進程沒有控制 終端。因為會話首進程是具有唯一進程ID的單個進程,所以可以將會話首進程的進程ID視為會話Id。此函數配合umask()可將進程變成守護進程。
8.pid_t wait(int * status);
功能:阻塞該進程,直到其某個子進程退出.
9.pid_t wait (int * status);
#include<sys/types.h>,#include<sys/wait.h>。wait()會暫時停止目前進程的執行,直到有訊號來到或子進程結束。回收殭屍進程
10.pid_t waitpid(pid_t pid,int * status,int options);
參數 pid 為欲等待的子進程識別碼,其他數值意義如下:
pid<-1 等待進程組識別碼為 pid 絕對值的任何子進程。 pid=-1 等待任何子進程,相當於 wait()。 pid=0 等待進程組識別碼與目前進程相同的任何子進程。 pid>0 等待任何子進程識別碼為 pid 的子進程。
參數 option 可以為 WNOHANG, 如果沒有任何已經結束的子進程則馬上返回, 不予以等待。
二.進程間的通訊
1.訊號量
1) int sem_wait(sem_t *sem);
//P操作,若是訊號量大於零則減一,否則阻塞在該函數位置等待.
2) int sem_post(sem_t *sem);
//V操作,訊號量加一
3) sem_t *sem_open(const char *name, int oflag);
//開啟訊號量,flag參數與開啟普通檔案的標記一樣
4) sem_t *(const char *name, int oflag,mode_t mode, unsigned int value);
//建立並開啟訊號量,value參數指的是訊號量的初始值oflag參數可以是0、O_CREAT(建立一個號誌)或O_CREAT|O_EXCL(如果沒有指定的號誌就建立),
其中mode參數指定許可權位(00777).
5) int sem_unlink(const char *name);
//刪除系統建立的訊號量
6) int sem_close(sem_t *sem);
//關閉徹底銷毀訊號量
2.管道
int pipe(int filedis[2]);
標頭檔#include <unistd.h>,參數filedis返回兩個檔案描述符:filedes[0]為讀而開啟,filedes[1]為寫而開啟。filedes[1]的輸出是filedes[0]的輸入。
3.記憶體共用
#include <sys/mman.h>
void *mmap(void *start, size_t length, int prot, int flags,int fd, off_t offset);
int munmap(void *start, size_t length);
例子:
p_map = (people*)mmap(NULL,sizeof(people)*10,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
p_map=(people*)mmap(NULL,sizeof(people)*10,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);//匿名,適合父子進程之間
munmap( p_map,sizeof(people)*10 );