在内核里面开辟一片内存,进程1和进程2都可以通过这片内存进行通信
- #include
- int pipe(int pfd[2]);
- 成功时返回0,失败时返回EOF
- pfd包含两个元素的整形数组,用来保存文件描述符
- pfd[0]用于读管道;pfd[1]用于写管道
示例代码:
- #include
- #include
- #include
- int main()
- {
- int pfd[2];
- int re;
- char buf[20] = {0};
- __pid_t pid;
- re = pipe(pfd);
- if(re < 0)
- {
- perror("pipe");
- return 0;
- }
- printf("%d,%d\n",pfd[0],pfd[1]);
- pid = fork();
- if(pid < 0)
- {
- perror("fork");
- return 0;
- }else if(pid == 0)//子进程
- {
- close(pfd[0]);
- while (1)
- {
- strcpy(buf,"hahahahhahah");
- write(pfd[1],buf,strlen(buf));
- sleep(1);
- }
- }else // 父进程
- {
- close(pfd[1]);
- while (1)
- {
- re = read(pfd[0],buf,20);
- if(re > 0)
- {
- printf("red pipe=%s\n",buf);
- }
- }
- }
- }
运行结果:
创建两个子线程,两个子线程对管道就行写,一个父进程对管道进行读,示例代码:
- #include
- #include
- #include
- int main()
- {
- int pfd[2];
- int re,i;
- char buf[40] = {0};
- __pid_t pid;
- re = pipe(pfd);
- if(re < 0)
- {
- perror("pipe");
- return 0;
- }
- printf("%d,%d\n",pfd[0],pfd[1]);
- for(i = 0;i < 2;i++)
- {
- pid = fork();
- if(pid < 0)
- {
- perror("fork");
- return 0;
- }
- else if(pid > 0)// 父进程
- {
-
- }
- else //子进程
- {
- break;
- }
- }
- if (i == 2)//父进程执行到这里
- {
- close(pfd[1]);
- while (1)
- {
- memset(buf,0,40);
- re = read(pfd[0],buf,20);
- if(re > 0)
- {
- printf("%s\n",buf);
- }
- }
- return 0;
- }
- if (i == 1)
- {
- close(pfd[0]);
- while (1)
- {
- strcpy(buf,"this is 2 process");
- write(pfd[1],buf,strlen(buf));
- usleep(930000);
- }
- return 0;
- }
- if (i == 0)
- {
- close(pfd[0]);
- while (1)
- {
- strcpy(buf,"this is 1 process");
- write(pfd[1],buf,strlen(buf));
- sleep(1);
- }
- return 0;
- }
- }
运行结果:
1.读管道:
(1)管道中有数据,read返回实际读到的字节数
(2)管道中无数据:
2.写管道:
(1)管道读端全部被关闭(就是读写全关闭),进程异常终止(也可以使用SIGPIPE信号,使进程不终止)
(2)管道读端没有全部关闭(就是把写关闭,没有关闭读):
- #include
- #include
- int mkfifo(const char *path,mode_t mode);
- 成功时返回0,失败时返回EOF
- path创建的管道文件路径
- mode管道文件的权限,如666
示例代码:
向文件写:
- #include
- #include
- #include
- #include
- #include
- #include
- int main()
- {
- int re;
- int fd;
- char buf[32];
- re = mkfifo("./myfifo",0666);
- if (re < 0)
- {
- perror("mkfifo");
- // return 0;
- }
- fd = open("./myfifo",O_WRONLY);
- if (fd < 0)
- {
- perror("open");
- return 0;
- }
- while (1)
- {
- fgets(buf,32,stdin);
- write(fd,buf,strlen(buf));
- }
- }
向文件读:
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- int main()
- {
- int re;
- int fd;
- char buf[32];
- fd = open("./myfifo",O_RDONLY);
- if (fd < 0)
- {
- perror("open");
- // return 0;
- }
- while (1)
- {
- re = read(fd,buf,32);
- if (re > 0)
- {
- printf("read fifo=%s\n",buf);
- }
- else
- {
- exit(0);
- }
- }
- }
运行结果:
open函数四种状态
open(const char *path,O_RDONLY);
open(const char *path,O_RDONLY|O_NONBLOCK);
open(const char *path,O_WRONLY);
open(const char *path,O_WRONLY|O_NONBLOCK);