免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2997 | 回复: 2
打印 上一主题 下一主题

命名管道(mkfifo)的建立、读/写疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-17 10:28 |只看该作者 |倒序浏览
写了个简单的测试源码如下:

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

int main(int argc, char **argv)
{
               char nm[]="/home/abcdefg";

                mkfifo(nm, S_IRUSR|S_IWUSR|S_IROTH|S_IWOTH|S_IRGRP|S_IWGRP);

        int rfp;
        int wfp;
       
        int len;

        if (fork() > 0)
        {
                wfp = open(nm, O_WRONLY);

                char *buf = NULL;
                                buf = new char[30];

                cerr << "will write.........." << endl;
                len = 5;
               
                for (int i = 0; i < 5; i++)
                {
                        memset(buf, 0, 30);
                       
                        memcpy(&buf[sizeof(len)], "hello", len);
                        memcpy(buf,&len, sizeof(len));
                        write(wfp, buf, 5+sizeof(len));
                        delete []buf;
                        buf = NULL;
                }
                close(wfp);
        }
        else
        {
                rfp = open(nm, O_RDONLY);

                int ret;
                int row_size = 0;
                       
                char bb[10] = {0};
                char *buf = NULL;
                buf = new char[30];

                cerr << "will read------------------------" << endl;
                       
                int readsize = 0;
                       
                while (1)
                {
                        memset(buf, 0, 30);
                        readsize = read(rfp, buf, sizeof(int));
                        fprintf(stderr, "01-readsize=%d\n", readsize);
                        if (!readsize)
                        {
                                fprintf(stderr, "01-out while.\n");
                                delete []buf;
                                buf = NULL;
                                break;
                        }
                        memcpy(&row_size, buf, sizeof(row_size));
                        if (!row_size)
                        {
                                fprintf(stderr, "row_size=%d\n",row_size);
                                delete []buf;
                                buf = NULL;
                                break;
                        }

                       
                        fprintf(stderr, "[read]row_size=%d\n", row_size);
                        readsize = read(rfp, buf, row_size);
                        fprintf(stderr, "02-readsize=%d\n", readsize);
                        if (!readsize)
                        {
                                fprintf(stderr, "02-out while.\n");
                                delete []buf;
                                buf = NULL;
                                break;
                        }
                        fprintf(stderr, "[read]buf=%s\n", buf);
                        delete []buf;
                        buf = NULL;
                }

                ret = close(rfp);
                cerr << "first-ret=" << ret << endl;
                ret = close(rfp);
                cerr << "second-ret=" << ret << endl;
        }
       
        exit(0);
}

平台是:
Red Hat Enterprise Linux AS release 4 (Nahant Update 4)
Kernel 2.6.9-42.ELsmp on an i686

疑问是:
1。 读取(read)的时候如何判定所有的数据已经写完并被读取完?(注:写数据时还不知道总共要写多少数据到管道,但每次写的数据大小是知道的;可能会出现有段时间没有数据写入管道,然后又有数据写入的情况)
2。 读写操作的O_NONBLOCK标志的设置应该如何使用?
3。 请有经验的仁兄指教:通常情况下如何建立一个命名管道并读/写它?

等~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~指点ing。。。。。。。。。。

论坛徽章:
0
2 [报告]
发表于 2007-04-17 10:37 |只看该作者
1.写入端写完的时候关闭文件描述符,这样读端read返回0就知道关闭了.

论坛徽章:
0
3 [报告]
发表于 2007-04-17 11:09 |只看该作者
原帖由 converse 于 2007-4-17 10:37 发表
1.写入端写完的时候关闭文件描述符,这样读端read返回0就知道关闭了.


再请教:

通常情况下是在“O_WRONLY”打开管道时设置“O_NONBLOCK”还是在“O_RDONLY”打开管道时设置“O_NONBLOCK”?是不是两端打开不能都设置“O_NONBLOCK”标志?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP