进程间通信:管道
- 什么是管道: 当从一个进程链接数据流到另一个ie进程时,我们使用术语管道。
- shell负责标准输入和标准输出
- 进程管道
- 传递数据的方法使用popen和pclose函数
- 代码示例
-
#include<stdio.h> FILE *popen(const char *command,const char *open_mode); int pclose(FILE *stream_to_close);
- 将输出送往popen
- 传递跟更多的数据
- 如何实现popen
-
#include<unistd.h> #include<stdlib.h> #include<string.h> #include<stdio.h> int main(){ FILE *read_fp ; char buffer[BUFSIZ +1] ; int chars_read ; memset(buffer,'\0',sizeof(buffer)); read_fp = popen("uname -a ","r"); if(read_fp !=NULL){ chars_read = fread(buffer,sizeof(char),BUFSIZ,read_fp); if(chars_read > 0){ printf("output was : \n %s \n",buffer); } pclose(read_fp); exit(EXIT_SUCCESS); } exit(EXIT_FAILURE); }
#include<unistd.h> #include<stdlib.h> #include<string.h> #include<stdio.h> int main(){ FILE *write_fp ; char buffer[BUFSIZ +1] ; sprintf(buffer,"once upon a time ,there was ..."); write_fp = popen("od -a ","w"); if(write_fp !=NULL){ fwrite(buffer,sizeof(char),strlen(buffer),write_fp); pclose(write_fp); exit(EXIT_SUCCESS); } exit(EXIT_FAILURE); }
#include<unistd.h> #include<stdlib.h> #include<string.h> #include<stdio.h> int main(){ FILE *read_fp ; char buffer[BUFSIZ +1] ; int chars_read ; memset(buffer,'\0',sizeof(buffer)); read_fp = popen("ps ax","r"); if(read_fp !=NULL){ chars_read = fread(buffer,sizeof(char),BUFSIZ,read_fp); while(chars_read > 0){ buffer[chars_read -1] = '\0' ; printf("output was : \n %s \n",buffer); chars_read = fread(buffer,sizeof(char),BUFSIZ,read_fp); } pclose(read_fp); exit(EXIT_SUCCESS); } exit(EXIT_FAILURE); }
- pipe调用
- pipe函数原型
- 命名管道:FIFO
- 在不相关直接交换数据,需要命名管道
- 创建管道命名
-
#include<unistd.h> #include<stdlib.h> #include<stdio.h> #include<sys/types.h> #include<sys/stat.h> int main(){ int res = mkfifo("/tmp/my_fifo",0777); if(res ==0){ printf("FIFO created \n"); } exit(EXIT_SUCCESS); }
-
- ls -lF /tmp/my_fifo 第一个字符是P开头就表示是管道
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<string.h>
#define FIFO_NAME "/tmp/my_fifo"
int main(int argc,char *argv[]){
int res ;
int open_mode =0 ;
int i;
if(argc<2){
fprintf(stderr,"Usage: %s < some combination of O_RDONLY O_WRONLY O_NONBLOCK > \n",*argv);
exit(EXIT_FAILURE);
}
for ( i = 1; i < argc; i++)
{
if(strncmp(*++argv,"O_RDONLY",8)== 0){
open_mode |= O_RDONLY ;
}
if(strncmp(*argv,"O_WRONLY",8) == 0){
open_mode |= O_WRONLY ;
}
if(strncmp(*argv,"O_NONBLOCK",10) == 0){
open_mode |= O_NONBLOCK ;
}
}
if(access(FIFO_NAME,F_OK) == -1){
if(res !=0){
printf("cound not create fifo . %s \n",FIFO_NAME);
exit(EXIT_FAILURE);
}
}
printf("Process %d opening FIFO \n",getpid());
res = open(FIFO_NAME,open_mode);
printf("Process %d result %d \n",getpid(),res);
sleep(5);
if(res ==-1){
(void)close(res);
}
printf("Process %d finished \n",getpid());
exit(EXIT_SUCCESS);
}
- 客户/服务框架架构