无名管道(一)

无名管道

UNIX网络编程:进程间的通信
手写之管道篇

代码

myhead.h

#ifndef MYHEAD_H_
#define MYHEAD_H_

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

#define MAXLINE         4096
#endif

mypipe.c

#include"myhead.h"

void server(int, int), client(int, int);

int main()
{
        pid_t child = 0;
        int pipe1[2], pipe2[2];

        pipe(pipe1);
        pipe(pipe2);

        if((child = fork()) == 0)
        {
                close(pipe1[1]);
                close(pipe2[0]);

                client(pipe1[0], pipe2[1]);

                exit(0);
        }

        close(pipe1[0]);
        close(pipe2[1]);

        server(pipe2[0], pipe1[1]);

        waitpid(child, NULL, 0);

        exit(0);
}

void client(int readfd, int writefd)
{
        char buff[MAXLINE] = {0};
        ssize_t len = 0;  //千万别写成无符号的int  size_t等类型,或导致隐式转换-1变成INT_MAX > 0,导致循环无法结束
        int flags = 0;

        fgets(buff, MAXLINE, stdin);
        len  = strlen(buff);
        if(buff[len - 1] == '\n')
                len--;

        write(writefd, buff, len);
#if 1
//改变readfd为非阻塞读,使程序可以自行结束
        flags = fcntl(readfd, F_GETFL, 0);
        if(flags < 0)
        {
                perror("fcntl");
        }
        flags |= O_NONBLOCK;
        fcntl(readfd, F_SETFL, flags);
#endif

        sleep(1);
#if 0
//当时len被申明为int,导致-1转换成INT_MAX 死循环,查了半天 read 返回的使ssize_t
        while((len = read(readfd, buff, MAXLINE)) > 0)
        {
                printf("%s", buff);
                memset(buff, 0, MAXLINE);
        }
#endif
        len = read(readfd, buff, MAXLINE);
        while(len > 0)
        {
                printf("%s", buff);
                len = read(readfd, buff, MAXLINE);
        }
        return;
}

void server(int readfd, int writefd)
{
        char buff[MAXLINE] = {0};
        int fd;
        size_t len = 0;

        read(readfd, buff, MAXLINE);
        printf("read %s\n", buff);
        fd = open(buff, O_RDONLY);
        if(fd < 0)
        {
                printf("cannot open %s\n", buff);
                return ;
        }
        while((len = read(fd, buff, MAXLINE)) > 0)
        {
                write(writefd, buff, MAXLINE);
        }
        printf("server close\n");
        close(fd);
        return;
}

编译后执行,输入当前文件夹下的某个文件即可得到输出。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值