同时建立一个管道的读写

#include <func.h>
//同时对一个管道进行读写
int main(int argc, char *argv[])
{
    ARGS_CHECK(argc,2);
    //遵循POSIX(可移植),以非阻塞方式同时建立管道的读写端
    int fdr = open(argv[1] , O_RDWR|O_NONBLOCK);
    ERROR_CHECK(fdr,-1,"open");
    int fdw = open(argv[1] , O_RDWR|O_NONBLOCK);
    ERROR_CHECK(fdw,-1,"open");
    fd_set rdset;//读等待集合
    fd_set wrset;//写等待集合 
    int cnt=0;
    char wrbuf[4096];
    char rdbuf[4096];
    while(1)
    {
        FD_ZERO(&rdset);
        FD_ZERO(&wrset);
        FD_SET(fdr,&rdset);
        FD_SET(fdw,&wrset);
        select(fdw+1,&rdset,&wrset,NULL,NULL);//写端的文件描述符是最大的
        if(FD_ISSET(fdw,&wrset))
        {//写端就绪
        //    gets(wrbuf);
            printf("cnt=%d\n",++cnt);
        //    read(STDIN_FILENO,wrbuf,sizeof(wrbuf));
            write(fdw,wrbuf,4096);//一次写入不能超过4096字节,因为内核缓冲区大小为4096B,超过会写阻塞
            puts("write success");
        }
        if(FD_ISSET(fdr,&rdset))
        {//读端就绪
            read(fdr,rdbuf,sizeof(rdbuf));
            puts(rdbuf);
            puts("read success");
        }
    }
    close(fdr);
    close(fdw);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43496435/article/details/114242167
今日推荐