進(jìn)程間通信(IPC)是指在不同進(jìn)程之間傳遞信息,。linux的進(jìn)程通信方式有管道,消息隊(duì)列,,信號(hào)量,,共享內(nèi)存,套接口等方式,下面一一整理,。
首先是管道(PIPE),,管道是Unix系統(tǒng)IPC最古老的方式,所有的Unix系統(tǒng)都提供這種通信機(jī)制,。它的優(yōu)點(diǎn)在于簡(jiǎn)單易用,,缺點(diǎn)在于有限制,詳細(xì)見(jiàn)下面幾點(diǎn):
- 只能用于父子進(jìn)程或兄弟進(jìn)程之間通信
- 大多數(shù)系統(tǒng)中都是半雙工的,,數(shù)據(jù)信息只能單向流動(dòng),,如果需要雙向通信則需要建立兩個(gè)管道
- 傳輸?shù)氖菬o(wú)格式字節(jié)流,需要雙方約定格式
- 管道緩沖區(qū)是有限的,,等等
首先來(lái)看父子進(jìn)程之間通信的例子,。
- #include<stdio.h>
- #include<limits.h>
- #include<sys/types.h>
- #include<string.h>
- #include<stdlib.h>
-
- #define BUFSIZE PIPE_BUF //管道默認(rèn)一次性讀取的數(shù)據(jù)長(zhǎng)度
-
- void err_quit(char *err) {
- printf("%s\n",err);
- exit(-1);
- }
-
- int main()
- {
- int fd[2];
- char buf[BUFSIZE] = "hello my son";
- pid_t pid;
-
- if (pipe(fd) < 0) {
- err_quit("pipe error");
- }
- if ((pid = fork()) < 0) {
- err_quit("fork error");
- }
- else if(pid > 0) { //父進(jìn)程
- close(fd[0]);
- write(fd[1], buf, strlen(buf));
- }
- else {
- close(fd[1]);
- int len = read(fd[0], buf, BUFSIZE);
- if (len < 0) {
- err_quit("read error");
- }
- printf("Get : %s\n",buf);
- }
- return 0;
- }
接下來(lái)是兄弟進(jìn)程之間通信的例子。
- #include<stdio.h>
- #include<limits.h>
- #include<sys/types.h>
- #include<string.h>
- #include<stdlib.h>
-
- #define BUFSIZE PIPE_BUF //管道默認(rèn)一次性讀取的數(shù)據(jù)長(zhǎng)度
-
- void err_quit(char *err) {
- printf("%s\n",err);
- exit(-1);
- }
-
- int main()
- {
- int fd[2];
- char buf[BUFSIZE] = "hello my brother";
- pid_t pid;
-
- if (pipe(fd) < 0) {
- err_quit("pipe error");
- }
- if ((pid = fork()) < 0) {
- err_quit("fork error");
- }
- else if(pid > 0) { //父進(jìn)程
-
- if ((pid = fork()) < 0) {
- err_quit("fork error");
- }
- else if (pid > 0) { //父進(jìn)程
-
- }
- else {
- close(fd[0]);
- write(fd[1], buf, strlen(buf));
- }
- }
- else {
- close(fd[1]);
- int len = read(fd[0], buf, BUFSIZE);
- if (len < 0) {
- err_quit("read error");
- }
- printf("Get : %s\n",buf);
- }
- return 0;
- }
代碼都很簡(jiǎn)單,,只是需要記住在創(chuàng)建新進(jìn)程后記得分別關(guān)閉讀寫(xiě)描述符,。如果想讓子進(jìn)程給父進(jìn)程傳遞數(shù)據(jù),則關(guān)閉父進(jìn)程的寫(xiě)描述符和子進(jìn)程的讀描述符即可,。利用管道可以做簡(jiǎn)單的進(jìn)程同步工作,,因?yàn)樽x端會(huì)一直阻塞到寫(xiě)端發(fā)出數(shù)據(jù)后再運(yùn)行后面的代碼,可以利用這個(gè)特點(diǎn)保證讓指定的進(jìn)程先運(yùn)行,。
|