您的位置:首页 > 运维架构 > Linux

读书笔记之linux/unix系统编程手册(44)

2015-08-25 19:30 676 查看
管道和FIFO

1.管道是一个字节流意味着在使用管道时是不存在消息或消息边界的,从管道中读取数据的进程可以读取任意大小的数据块,而不管进程写入的数据块大小,如果需要实现离散消息的概念,最好使用其他的IPC机制如消息机制和数据报socket

2.管道是单向的

3.可以确保写入不超过pipe_buf字节的操作是原子的,只有在数据被传输到管道时候,pipe_buf限制才起作用,当写入的数据达到pipe_buf时,write()会在必要的时候阻塞直到管道可用空间可以完成原子操作
4.管道是一个在内核内存中的维护的缓冲器,这个缓冲器的存储能力是有限的。一旦管道被填满后,后续向该管道的写入操作就会被阻塞直到从管道中移除了一些数据为止

int main(int argc, char* argv[])
{

int fields[2];
char buf[MAX_SIZE];
if(pipe(fields) == -1)
{
perror("pipe");
}
//printf("hello world\n");

int pid = fork();
if(pid == -1)
{
perror("fork");
}else if(pid > 0)
{
if(close(fields[0]) == -1)
{
perror("close");
}
while(memset(buf, MAX_SIZE, 0) && gets(buf))
{
write(fields[1], buf, MAX_SIZE);
}
if(close(fields[1]) == -1)
{
perror("close");
}

}else
{
if(close(fields[1]) == -1)
{
perror("close");
}
while(1)
{
read(fields[0], buf, MAX_SIZE);
printf("%s\n", buf);
memset(buf, MAX_SIZE, 0);
}
if(close(fields[0]) == -1)
{
perror("close");
}
}

//both parent and children do below

return 0;
}
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <string.h>
#include <fcntl.h>

#define MAX_SIZE 1024
#define FIFO "./fifo"

int main(int argc, char* argv[])
{

char buf[1024];

if(mkfifo(FIFO, 0777) == -1)
{
perror("fifo");
exit(1);
}
int pid = fork();
if(pid == -1)
{
perror("fork");
exit(1);
}
if(pid == 0)
{
int wr = open(FIFO, O_WRONLY);
if(wr == -1)
{
perror("wr");
exit(1);
}

while(memset(buf, 1024, 0) && gets(buf))
{
write(wr, buf, sizeof(buf));
}
}else
{
int rd = open(FIFO, O_RDONLY);
if(rd == -1)
{
perror("rd");
exit(1);
}
while(1)
{
memset(buf, 1024, 0);
read(rd, buf, sizeof(buf));
printf("%s\n", buf);
}
}
return 0;
}
5.FIFO与管道,他们两者之间最大的差别在于FIFO在文件系统中拥有一个名称并且其打开方式与打开一个普通文件一样的,也称为命名管道

6.mode指定了权限,一旦FIFO被创建,任何进程都能够打开它,只要它能够通过常规的文件检测

7.打开一个FIFO会同步读取进程和写入进程

8.无法使用单个FIFO向所有客户端发送响应,因为会形成竞争关系
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: