Unix高级编程 使用setvbuf实现setbuf

来源:互联网 发布:程序员简历下载 编辑:程序博客网 时间:2024/05/16 17:53

setbuf的关键在于所涉及的流类型,如普通文件,pipe,socket等。

此处,我的默认处理:

1.若流为pipe,socket,字符设备和块设备,采用行缓冲

2.若流为stderr,采用不带缓冲

3.其他为全缓冲


(此处的分类尚需细分,欢迎改正)


所以代码以及测试代码如下:

#include <stdio.h>#include <string.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <errno.h>//#define error(str) printf("%s",str)void set_buf(FILE *stream,char *buf);int main(){  FILE *fp=fopen("input.txt","wb+");  char buf[BUFSIZ];  printf("%d",BUFSIZ);  set_buf(fp,buf);  set_buf(stderr,buf);  set_buf(stdin,buf);  set_buf(stdout,buf);  sleep(100);}void set_buf(FILE *stream ,char *buf){   struct stat st;    if(stream==NULL)    error("stream is NULL");  if(buf==NULL)    {      fclose(stream);      error("close stream");    }  int file=fileno(stream);  if(-1==fstat(file,&st))    {      printf("fstat error:%s\n",strerror(errno));    }  int length=strlen(buf);  if(stream==stderr)    {       if(0!=setvbuf(stream,buf,_IONBF,length))printf("servbuf error:%s\n",strerror(errno));      else{  printf("NOBUF OK\n");}    } else if(S_ISFIFO(st.st_mode)||S_ISSOCK(st.st_mode)||S_ISCHR(st.st_mode)||S_ISBLK(st.st_mode))    {      if(0!=setvbuf(stream,buf,_IOLBF,length))printf("servbuf error:%s\n",strerror(errno));      else{  printf("Line BUF OK\n");}    } else   {      if(0!=setvbuf(stream,buf,_IOFBF,length))printf("servbuf error:%s\n",strerror(errno));      else{  printf("Full BUF OK\n");}   }}


0 0
原创粉丝点击