下面幾節,將分別溫習下linux程序進通訊的幾種機制
1:管道
管道是比較古老的程序間的通訊方式。主要有有名管道和無名管道兩種。
2:無名管道
它的特點就是:
1:只能使用在具有親緣關係的程序之間的通訊(父子程序或者兄弟程序之間)。因為只有具有親緣關係的程序才能繼承其建立的檔案描述符。
2:是乙個半雙工的通訊模式,具有固定的讀端和寫段。
3:可以將管道看著特殊的檔案,也可以呼叫read()和write()操作。
管道是基於檔案描述符的通訊方式,當乙個管道建立時,它會建立兩個檔案描述符fd[0]和fd[1],其中fd[0]是固定用於讀管道, 而fd[1]是固定用於寫管道,構成乙個半雙工通道。
當乙個管道共享多對檔案描述符時,若將其中的一對讀寫檔案描述符都刪除,則該管道將失效。
上面插圖來自《linux應用程式開發標準教程》中,從圖中可以看到當fork()後 , 子程序會繼承父程序建立的管道,這樣父子程序都擁有了自己的讀寫通道, 從而實現了父子之間的讀寫,只需要把無關的讀端或寫段的檔案描述符關閉即可。
例如上圖中,父程序負責讀段,則把它的寫段fd[1]關閉, 子程序負責寫,則把它的讀段fd[0]關掉。這樣就建立起來一條「子程序寫父程序讀」的通道。
下面來看一下無名管道的例項,直接上**:
#include
#include
#include
#include
#include
#define max_data_len 128
#define delay_time 1
int main()
; const char data ="pipe test program";
int real_read, real_write;
if( pipe(pipe_fd) < 0)
if((pid = fork()) == 0)
close(pipe_fd[0]);
exit(0);
} else
if (pid > 0)
close(pipe_fd[0]);
exit(0);
} else
if (pid > 0)
close(pipe_fd[1]);
waitpid(pid, null, 0);
exit(0);
}
return
0;}
執行結果:
write to pipe is: pipe test program
read data from pipe is pipe test program
3:有名管道
有名管道突破了無名管道的限制,可以使兩個不相關的程序實現彼此之間的通訊。相當於建立乙個檔案,建立管道之後,兩個程序可以把它當做普通檔案一樣進行讀寫操作。嚴格遵循先進先出規則,對管道及fifo的讀寫總是從開始出返回資料,對它們的寫則把資料新增到末尾,需要指出的是不支援lseek()等檔案定位操作。
可以採用mkdfifo()函式來建立乙個命名管道,建立成功後就可以使用open, read, write函式進行操作。
mkfifo函式原型:
int mkfifo(const char *filename, mode_t mode)
傳參: filename為要建立的管道,包括路徑名
mode只建立的管道許可權,一般有o_rdonly(讀管道), o_wronly(寫管道),o_rdwr(讀寫管道),o_nonblock:非堵塞管道。 o_creat(如果檔案不存在,則新建檔案),o_excl:可以測試檔案是否存在。
下面來看乙個有名管道的例子,為了方便看**,直接將命名管道應用在父子程序間通訊:
這#include
#include
#include
#include
#include
#include
#include
#define myfifo "myfifo"
#define max_data_len 128
#define delay_time 1
int main()
; const
char data ="pipe test program";
int real_read, real_write;
int fd = 0;
// memset((void *)buf, 0, sizeof(buf));
if(access(myfifo, f_ok) == -1)
}if((pid = fork()) == 0)
if(write(fd, data, strlen(data)) > 0)
close(fd);
exit(0);
} else
if (pid > 0)
if(read(fd, buf, max_data_len) > 0)
close(fd);
exit(0);
}return
0;}
執行結果:
write pipe test program to fifo
read pipe test program from fifo
下一節將溫習訊號的使用
linux程序間通訊之管道通訊
一 命名管道通訊 管道通訊分為 無名管道和有名管道 無名管道是用於父子孫程序,之間有血緣關係 有名管道 用於任意兩個程序 無名管道 1 建立 int pipe int filedis 2 它會建立兩個檔案描述符 filedis 0 用於讀管道 filedis 1 用於寫管道 通常先建立乙個管道,再通...
Linux程序間通訊之管道
管道,你可以把它想成一根資料線,連線了兩個程序,使他們可以互相通訊。更嚴謹來說,它是乙個檔案或者一塊共享區,乙個程序往裡面寫資料,另乙個程序從裡面拿資料,以此種方式完成程序間通訊。管道是unix系統ipc最古老的形式,所有的unix系統都提供此種通訊機制 unix系統ipc是各種程序通訊方式的統稱 ...
Linux 程序間通訊之管道
這裡說的管道是指匿名管道 無名管道 是 unix 系統ipc最古老的形式。其本質是乙個偽檔案 實為核心緩衝區 它是半雙工的 即資料只能在乙個方向上流動 具有固定的讀端和寫端。它只能用於具有親緣關係的程序之間的通訊 也是父子程序或者兄弟程序之間 它可以看成是一種特殊的檔案,對於它的讀寫也可以使用普通的...