QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 868|回复: 7

关于这段代码的一点细节问题

[复制链接]
发表于 2004-1-20 13:08:20 | 显示全部楼层 |阅读模式
以下代码是关于系统调用read和write的。一本书上的例子
里面调用close时没有检验其返回码,这严谨吗?算错误吗?记得看过另外一本书,说不检查close的返回码是一个严重的编程错误

[code:1]

/* fread.c - The read and write system calls */

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    int fdsrc, fdnull, fdtmp, numbytes;
    int flags = O_CREAT | O_TRUNC | O_WRONLY;
    char buf[10];
   
    /* open the source file, /dev/null, and /tmp/foo.bar */
    if ((fdsrc = open("fdread.c", O_RDONLY, 0644)) < 0) {
        perror("open fdread.c");
        exit(EXIT_FAILURE);
    }
    if ((fdnull = open("/dev/null", O_WRONLY)) < 0) {
        perror("open /dev/null");
        close(fdsrc);  /* close this since we've opened it */
        exit(EXIT_FAILURE);
    }
    if ((fdtmp = open("/tmp/foo.bar", flags, 0644 < 0)) < 0) {
        perror("open /tmp/foo.bar");
        close(fdsrc);  /* have to close both of these now */
        close(fdnull);
        exit(EXIT_FAILURE);
    }
   
    /* read and write 10 bytes at a time */
    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/foo.bar");
        }
    }
   
    /* close files and exit */
    close(fdsrc);
    close(fdnull);
    close(fdtmp);
   
    exit(EXIT_SUCCESS);
}

[/code:1]
发表于 2004-1-20 15:57:39 | 显示全部楼层
没问题啊

即使不close也没事,系统会在进程结束的时候,把你所打开的文件关掉
回复

使用道具 举报

 楼主| 发表于 2004-1-20 23:44:02 | 显示全部楼层
是吗?手册页上写的有吗
回复

使用道具 举报

发表于 2004-1-21 00:01:00 | 显示全部楼层
关键不在于是否close,关键在于要及时地close文件,这样才能尽量节省文件描述符这种资源~
回复

使用道具 举报

 楼主| 发表于 2004-1-21 11:43:53 | 显示全部楼层
[quote:68838efc13="sjinny"]关键不在于是否close,关键在于要及时地close文件,这样才能尽量节省文件描述符这种资源~[/quote]

好像偏离话题了,在使用close时没有检查其返回码属于错误吗?
回复

使用道具 举报

发表于 2004-1-21 21:24:36 | 显示全部楼层
恩......恐怕不能说是“错误”,只能说是“不是非常严密”
问题在于,这样的检查有多少意义呢?再说,如果关闭失败,会造成多大的后果?如果调用close()关不掉,那还有什么办法呢?
回复

使用道具 举报

 楼主| 发表于 2004-1-22 17:59:28 | 显示全部楼层
[quote:d3ec2870ce="sjinny"]恩......恐怕不能说是“错误”,只能说是“不是非常严密”
问题在于,这样的检查有多少意义呢?再说,如果关闭失败,会造成多大的后果?如果调用close()关不掉,那还有什么办法呢?[/quote]

系统资源用过就要及时释放,这应该是一个编程的原则。如果关闭会失败,就要进一步完善程序。直到能保证正确实现它。我不认为应该去回避它。如果这个程序进一步写下去,实现更多的功能, 那么未关闭的文件描述符可能会引起一些严重的后果。所以……

谢谢您的回答。也许不该把它看成错误。我有点走极端了。
回复

使用道具 举报

发表于 2004-1-22 23:28:47 | 显示全部楼层
恩......完美主义有时侯的确是……
太极端的完美主义甚至可能引起强迫症的~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-9 01:01 , Processed in 0.038606 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表