一个简单非阻塞程序问题

liyi54188 2011-07-26 10:10:00
请问下我把标准输出设置为非阻塞了,为什么err.txt出错文件里没EAGAIN出错信息

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#define MAX 1000000
#define LEN 1024
int main(int argc, char **argv)
{
int fd1, fd2, flags;
FILE *fp;
char buf[MAX];
int n, rest;
char *p = buf;
char content[LEN];
if(argc != 3)
{
printf("expect args\n");
exit(1);
}
fd1 = open(argv[1], O_RDONLY);
if(fd1 == -1)
{
perror("fail to open");
exit(1);
}
fd2 = open(argv[2], O_WRONLY);
if(fd2 == -1)
{
perror("fail to open");
exit(1);
}
fp = fdopen(fd2, "w");
if(fp == NULL)
{
perror("fail to read");
exit(1);
}
flags = fcntl(STDOUT_FILENO, F_GETFL, 0);
if(flags == -1)
{
perror("fail to fcntl");
exit(1);
}

flags |= O_NONBLOCK;
if(fcntl(STDOUT_FILENO, F_SETFL, 0) == -1)
{
perror("fail to fcntl");
exit(1);
}

rest = read(fd1, buf, MAX);
printf("get %d bytes from %s\n", rest, argv[1]);

while(rest > 0)
{
errno = 0;
n = write(STDOUT_FILENO, p, rest);
fprintf(fp, "write %d, errno %s\n", n, strerror(errno));
if(rest > 0)
{
p += n;
rest -= n;
}
}
printf("done\n");
close(fd1);
fclose(fp);
return 0;
}
...全文
77 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
justkk 2011-07-26
  • 打赏
  • 举报
回复
考虑把输出定向到一个管道呢?
管道满了的时候,应该就EAGAIN了
liyi54188 2011-07-26
  • 打赏
  • 举报
回复
哦,那要在什么情况下才会阻塞出现EAGAIN呢?谢谢了
justkk 2011-07-26
  • 打赏
  • 举报
回复
在整个程序运行过程中,标志输出应该是持续可用的
只是慢点而已
liyi54188 2011-07-26
  • 打赏
  • 举报
回复
谢谢1楼回复,上次对我帮助很大啊!
liyi54188 2011-07-26
  • 打赏
  • 举报
回复
in.txt是个很大的文件,要写到标准输出,应该会产生阻塞啊
justkk 2011-07-26
  • 打赏
  • 举报
回复
标准输出设置为非阻塞,就会出错吗?
只有标准输出当前不是立即可用,并且非阻塞时,才会出错的
challenge99 2011-07-26
  • 打赏
  • 举报
回复
你好像还是没有明白kk的意思呢,出错和你读写的文件大小没有关系呢......只和是否可读写有关系
liyi54188 2011-07-26
  • 打赏
  • 举报
回复
重定向到管道也不行啊,err.txt里write 1000000,errno Success

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧