管道的認識從command1 | command2 認識開始,到現在做A2DP升華,寫一些使用FIFO的要點下來。
1 管道一般用于進程間通信,把一個進程的輸出通過管道送給另一個進程。
2 可以通過popen,pclose嘗試實現command1 | command2 。
File *popen(const char * command, const char *open_mode);
open_mode: r or w
File a =popen("uname -a", "r");
fread(buffer, 1, BUFSIZE, a);
printf("%s", buffer);
>> Linux Ubuntu 8.09..................
3 pipe創建管道
#include <unistd.h>
int pipe(int file_description[2]);
pipe的參數是由兩個文件描述符組成的數組。file_description[0] 用于讀管道, file_description[1] 用來寫管道。
4 命名管道:mkfifo
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char * filename, mode_t mode);
mode: O_RDONLY, O_WRONLY, O_NONBLOCK.
共四種組合:
O_RDONLY:阻塞讀方式打開,除非有進程以寫方式打開,不然阻塞。
O_RDONLY|O_NONBLOCK: 不論怎樣,立即返回,總是成功
O_WRONLY: 阻塞寫方式打開,直到有人來讀,不然阻塞
O_WRONLY|O_NONBLOCK: 立即返回,但如果沒人以讀方式打開,返回-1錯誤
FIFO SIZE:#include <limites.h>, PIPE_BUF, default 4096
多個進程可以寫同一個管道。