免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2890 | 回复: 4

关于read函数…… [复制链接]

论坛徽章:
0
发表于 2011-09-06 12:45 |显示全部楼层
嗯,是这样的……
            下面是我写的一段代码
/*
* this program is about the useage of read ang write
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>

int main(void)
{
        int fdsrc,fdnull,fdtmp,numbytes;
        int flag = O_CREAT | O_TRUNC | O_RDONLY;
        char buf[10];

        if (fdsrc = open("fopen.c",O_RDONLY,0644)<0) {
                perror ("open fopen.c");                            /*注意perror函数必须的参数必须用双引号括住*/
                exit(EXIT_FAILURE);
        }
        if (fdnull = open("/dev/null",O_RDONLY)<0) {
                perror("open /dev/null");
                close(fdsrc);
                exit(EXIT_FAILURE);
        }
        if (fdtmp = open("tmp",flag,0644)<0) {
                perror("open tmp");
                close(fdnull);
                close(fdsrc);
                exit(EXIT_FAILURE);
        }

        while((numbytes = read(fdsrc,buf,10))>0 ) {
                if (write(fdnull,buf,10) < 0) {
                        perror ("write /dev/null");
                }
                if (write(fdtmp,buf,numbytes) < 0) {
                        perror ("write tmp");
                }
        }

        close(fdsrc);
        close(fdnull);
        close(fdtmp);

        exit(EXIT_SUCCESS);
}

可是我运行后,它好像陷入了死循环一般,我猜是不是while循环那块出了问题,还请各位高手指点指点,小弟我这厢有礼了……

论坛徽章:
2
天蝎座
日期:2014-03-28 10:18:052015年亚洲杯之乌兹别克斯坦
日期:2015-02-10 11:32:25
发表于 2011-09-06 13:13 |显示全部楼层
帮lz调了一下
  1.   if (fdsrc = open("fopen.c",O_RDONLY,0644)<0) {
复制代码
这行语句有问题

因为优先级的关系,它相当于
  1.   if (fdsrc = (open("fopen.c",O_RDONLY,0644)<0)) {
复制代码
因为open总是成功的,所以open返回总是大于0,这个判断就是错误的,那么fdsrc=0

于是它的输入就是来自于标准输入

因为程序执行时会从标准输入读字符,表象上就像是死循环了

故本行与下面相似的几行应该改成
  1.   if ((fdsrc=open("fopen.c",O_RDONLY,0644)) < 0) {
复制代码

论坛徽章:
2
天蝎座
日期:2014-03-28 10:18:052015年亚洲杯之乌兹别克斯坦
日期:2015-02-10 11:32:25
发表于 2011-09-06 13:16 |显示全部楼层
多句嘴,说句不应该说的话

lz你这个问题不是啥大问题,简单调试一下就可以找到问题的

发到论坛上除非是一眼看出,较少有人会愿意帮忙解决这样的问题

只有俺这种水平低的人在闲的时候才会有兴趣

论坛徽章:
0
发表于 2011-09-06 14:24 |显示全部楼层
回复 3# txdgtwpv


    嗯,你说的是……
    小弟刚开始学习linux C,有些问题自己实在是解决不了,就找这儿来了……

论坛徽章:
0
发表于 2011-09-10 15:13 |显示全部楼层
回复 1# bongon-miffy


    优先级规则不熟悉时建议多加括号
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP