popen一般用于获取命令执行的输出,或者对命令进行输入(采用无名管道):
FILE *popen(const char *command, const char *type);
pipe用于无名管道:
int pipe(int pipefd[2]);
mkfifo用于有名管道:
int mkfifo(const char *pathname, mode_t mode);
-----------------------------------------------------------------------------------------------------------------------------------------
Linux进程通信:管道要点
管道的认识从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>
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
多个进程可以写同一个管道。
本文转自:http://www.cppblog.com/iuranus/archive/2009/08/09/92717.html