- 论坛徽章:
- 0
|
写了个简单的测试源码如下:
#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。。。。。。。。。。 |
|