***无名管道
创建:int pipe(int fd[2])
其中fd[0]用来读、fd[1]用来写。
所以一般在父进程中将fd[0]进行close 在子进程中将fd[1]进行close。
管道是单向通道,只能在一端进行数据的写入,另一端进行数据的读出,不能复用。
由于管道属于队列,所以管道中的东西在读取之后就会被删除,
当管道内已经写满时,再次写入会阻塞,直至读端将数据进行读出;
相反,读端如果发现管道内无数据时,就会阻塞住,直至写端将数据写入。
局限:只能在实现父子进程(有亲缘关系的进程)之间的通信
实例:将process_inter放进管道内,进行进程间的通信。
#include "unistd.h"
#include "stdio.h"
#include "sys/types.h"
#include "stdlib.h"
int main()
{
pid_t pid;
int fd[2];
int ret;
int process_inter=0;
ret=pipe(fd);
if(ret < 0)
{
printf("creat pipe failure\n");
return -1;
}
printf("creat pipe sucess\n");
pid = fork();
if(pid ==0)//child process code second
{
int i=0;
read(fd[0],&process_inter,1);//if pipe empty sleep
while(process_inter==0);
for(i=0;i<5;i++)
{
printf("this is child process i=%d \n",i);
usleep(100);
}
}
if(pid >0)//parent process code first
{
int i=0;
process_inter=0;
for(i=0;i<5;i++)
{
usleep(100);
printf("father pid i=%d \n",i);
}
process_inter++;
write(fd[1],&process_inter,1);
}
return 0;
}
***有名管道(有inode号)
mkfifo:用来创建文件节点,并未在内核中创建管道,但是不占磁盘空间。
当使用open函数打开文件时才会在内核空间中创建管道。
注:管道文件只有inode号,不占磁盘块空间,和套接字、字符设备文件、块设备文件一样普通文件和符号链接文件及目录文件,不仅有inode号,还占磁盘块空间。
实例:使用mkfifo创建有名管道,实现进程间的通信:
/* fork.c 创建有名管道 */
#include "unistd.h"
#include "stdio.h"
#include "sys/types.h"
#include "stdlib.h"
int main()
{
pid_t pid;
int fd[2];
int ret;
int process_inter=0;
ret=pipe(fd);
if(ret < 0)
{
printf("creat pipe failure\n");
return -1;
}
printf("creat pipe sucess\n");
pid = fork();
if(pid ==0)//child process code second
{
int i=0;
read(fd[0],&process_inter,1);//if pipe empty sleep
while(process_inter==0);
for(i=0;i<5;i++)
{
printf("this is child process i=%d \n",i);
usleep(100);
}
}
if(pid >0)//parent process code first
{
int i=0;
process_inter=0;
for(i=0;i<5;i++)
{
usleep(100);
printf("father pid i=%d \n",i);
}
process_inter++;
write(fd[1],&process_inter,1);
}
return 0;
}
/* first.c 第一个进程,并进行管道内数据的写入 */
#include "unistd.h"
#include "stdio.h"
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> /* Definition of AT_* constants */
#include <sys/stat.h>
int main()
{
int fd;
int i;
char process_inter=0;
fd=open("./myfifo",O_WRONLY);
if(fd <0)
{
printf("open myfifo failure\n");
return -1;
}
printf("open myfifo sucess\n");
for(i=0;i<5;i++)
{
printf("this is first process i=%d\n",i);
usleep(100);
}
process_inter=1;
sleep(5);
write(fd,&process_inter,1);
while(1);
return 0;
}
/* second.c 第二个进程 ,实现数据的读入*/
#include "unistd.h"
#include "stdio.h"
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> /* Definition of AT_* constants */
#include <sys/stat.h>
int main()
{
int fd;
int i;
int process_inter=0;
fd=open("./myfifo",O_RDONLY);
if(fd <0)
{
printf("open myfifo failure\n");
return -1;
}
printf("open myfifo sucess\n");
read(fd,&process_inter,1);
while(process_inter == 0);
for(i=0;i<5;i++)
{
printf("this is second process i=%d\n",i);
usleep(100);
}
while(1);
return 0;
}