命名管道理解与简单C实现

命名管道主要解决进程间消息传递的问题。 虽然是以文件的形式, 但是实际上消息仍然是存储在内存中的, 这也是无论何时查看管道文件都是0kb的原因。

以下是两个实例fifo_write.c和fifo_read.c:

fifo_read.c:

#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <string.h>
#include <unistd.h>

#define MYFIFO   "myfifo"    /* 有名管道文件名*/
#define MAX_BUFFER_SIZE   PIPE_BUF
/*常量PIPE_BUF 定义在于limits.h中*/

char buff[MAX_BUFFER_SIZE];
int  fd;
int  nread;

void f_read(){
    fd = open(MYFIFO, O_RDONLY);
    memset(buff, 0, sizeof(buff));
    nread = read(fd, buff, MAX_BUFFER_SIZE);
    printf("read:'%s' length:%d\n", buff, nread);
    close(fd);
}

int main(){
    if (access(MYFIFO, F_OK) == -1){
        if ((mkfifo(MYFIFO, 0666) < 0) && (errno != EEXIST)){
             printf("Cannot create fifo file\n");
                 exit(1);
        }
    }
    while (1){
        f_read();
    }
     exit(0);
}
fifo_write.c:

#include<sys/types.h>
#include<sys/stat.h>
#include<errno.h>
#include<fcntl.h>
#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
#include<unistd.h>
#include<string.h>

#define MYFIFO "myfifo"
#define MAX_BUFFER_SIZE PIPE_BUF

int fd;
char buff[MAX_BUFFER_SIZE];
int nwrite;

void f_write(){
    fd = open(MYFIFO, O_WRONLY);
    write(fd, buff, MAX_BUFFER_SIZE);
    close(fd);
}

int main(int argc, char * argv[]){
    if (access(MYFIFO, F_OK) == -1){
        if ((mkfifo(MYFIFO, 0666) < 0) && (errno != EEXIST)){
             printf("Cannot create fifo file\n");
                 exit(1);
        }
      }

    while(gets(buff)!=EOF){
        f_write();
    }
	exit(0);
}

Centos 7下编译:

gcc -o fifo_write fifo_write.c

gcc -o fifo_read fifo_read.c

运行程序:

在fifo_write下输出传输的文本, fifo_read下会读出对应的信息。

另外此种消息传递是阻塞式的, 先打开fifo_read或fifo_write都是一样的, 程序都会正常运行。

其它的相关管道的知识, 可以查阅相关的资料。  但是关于管道的使用, 容易出现问题, 项目中一旦出现阻塞不容易处理, 所以最终自己还是放弃了用管道来进行数据的传输。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值