參考:
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)作結束。
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 );
http://xxxxxx/Linuxjc/1148262.html TechArticle