|
|

楼主 |
发表于 2006-4-20 14:51:28
|
显示全部楼层
顶!希望大家能够在自己机器上跑一下。验证一下。
-------------------------------------
以下是读pipe程序:
-------------------------------------
/* linux pipe_buf大小为65536,read一次读取16384大小的内容
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string.h>
#define FIFO_SERVER "/tmp/fifo"
main(int argc,char** argv)
{
char r_buf[65536*2];
int fd;
int r_size;
int ret_size;
int i=0;
if (argc!=2) {
printf("Usage : %s number\n",argv[0]);
exit(1);
}
r_size=atoi(argv[1]);
printf("requred real read bytes %d\n",r_size);
memset(r_buf,0,sizeof(r_buf));
fd=open(FIFO_SERVER,O_RDONLY|O_NONBLOCK,0);
//非阻塞,当无写操作打开,或有写操作打开,但没写数据进去,则此读操作返回-1,当前的errno值为EAGAIN
// fd=open(FIFO_SERVER,O_RDONLY,0);
//阻塞,当无写操作打开,或有写操作打开,但没写数据进去,则此读操作阻塞;
//除此之外,造成阻塞的另外一种原因是,FIFO里有数据,但有另外的进程在读;
//阻塞只对本进程的第一个读操作有效,当读操作解除阻塞后,即使FIFO里无数据,余下的读操作均不会阻塞;
if(fd==-1)
{
printf("open %s for read error\n");
exit(1);
}
while(1)
{
ret_size=read(fd,r_buf,r_size);
if(ret_size==-1)
if(errno==EAGAIN)
printf("no data avlaible\n");
printf("%d : real read bytes %d\n",i,ret_size);
sleep(1);
i++;
}
pause();
unlink(FIFO_SERVER);
}
---------------------------------------------
以下是写pipe程序:
---------------------------------------------
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define FIFO_SERVER "/tmp/fifo"
main(int argc,char** argv)
{
int fd;
char w_buf[65536*2];
int real_wnum;
memset(w_buf,0,sizeof(w_buf));
if((mkfifo(FIFO_SERVER,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST))
printf("cannot create fifoserver\n");
fd=open(FIFO_SERVER,O_WRONLY|O_NONBLOCK,0); //设置非阻塞标志
// fd=open(FIFO_SERVER,O_WRONLY,0); //设置阻塞标志
if(fd==-1)
if(errno==ENXIO)
printf("open error; no reading process\n");
sleep(10);//用于测试读操作
real_wnum=write(fd,w_buf,32768);
if(real_wnum==-1)
{
if(errno==EAGAIN)
printf("write to fifo error; try later\n");
}
else
printf("real write num is %d\n",real_wnum);
real_wnum=write(fd,w_buf,65535);
/*PIPE_BUF为65536
*第一次写32768,空闲区为32768
*写操作非阻塞
* 当第二次写65537(大于PIPE_BUF)时,写入32768(尽量写满空闲区)后返回,有数据没写完
* 当第二次写65535(小于PIPE_BUF,但大于空闲缓冲区)时,写入32768(尽量写满空闲区)后返回,有数据没写完
这里有个临界点,当空闲区<4096时,第二次写入>=4096的数据时,返回EAGAIN错误
* 当第二次写32767(小于PIPE_BUF,也小于空闲缓冲区)时,可写完所有数据
*写操作阻塞
* 当第二次写65537(大于PIPE_BUF)时,先写一部分,一旦有空闲空间,便接着写,直到写完,成功返回(无原子性)
* 当第二次写65535(小于PIPE_BUF,但大于空闲缓冲区)时,写操作阻塞,直到空闲空间达到写入数据的要求后,一次性写完,返回(原子)
* 当第二次写32767(小于PIPE_BUF,也小于空闲缓冲区)时,可写完所有数据
*/
if(real_wnum==-1) {
if(errno==EAGAIN)
printf("try later\n");
} else printf("real write num is %d\n",real_wnum);
}
------------------------------------------------------------- |
|