码迷,mamicode.com
首页 > 系统相关 > 详细

Linux

时间:2016-05-04 10:37:21      阅读:532      评论:0      收藏:0      [点我收藏+]

标签:

1.上课时候有位同学问了一个问题以检验open和read,以下程序可以gcc编译并通过,多运行几次,输出的结果是-1,-1,-1,-1或者是3,0,0,0/4,0,0,0/4,-1,-1,-1.请解释原因。

#include<stdio.h>

int main()

{

        char buff[5];

        int fd=open("test.txt");

        printf("%d,%d,%d,%d\n",fd,read(fd,buff,5),read(fd,buff,5),read(fd,buff,5));

        return 0;

}

答:由于open函数打开/创建成功时返回文件描述符(0~255),打开/创建出错时,返回-1。对于read函数,同样的,若读取成功,返回字节数,若已到文件结尾,返回0,若出错,返回-1。对于-1,-1,-1,-1,是由于打开文件时文件不存在或者其它原因,打开文件失败,文件返回-1给fd,而后面又用这个错误的fd去读取数据,所以数据读取失败,均返回-1;而3/4,0,0,0是成功打开/创建了文件,此时文件描述符为3/4,然后可能是因为文件为空,所以一读取便遇到文件尾,返回0;而4,-1,-1,-1是成功的打开/创建了文件,然而读取发生错误(由于权限等问题),返回值均为-1。

 

 

2.上述代码存在隐含的错误,请修改上述源代码,用 echo "12345">test.txt 生成test.txt,正确的程序执行结果是3,0,1,5.请提交你修改后的代码。用 echo "1234">test.txt 生成test.txt,结果是什么?并解释为什么结果如此?

答:正确代码:

#include<stdio.h>

#include<fcntl.h>

int main()

{

        char buff[5];

        int fd=open("test.txt",O_CREAT,S_IRWXU);

        printf("%d,%d,%d,%d\n",fd,read(fd,buff,5),read(fd,buff,5),read(fd,buff,5));

        return 0;

}

 

当用 echo "1234">test.txt 生成test.txt,结果是3,0,0,5。3是成功打开文件返回的文件描述符,

 

 

3.尽管你修改的代码能够通过,但是对于打开的文件,我们退出之前还需要怎么做呢,原因何在?

答:在退出之前应该要关闭文件。因为当一个进程终止时,内核对该进程所有尚未关闭的文件描述符调用close关闭,所以即使用户程序不调用close,在终止时内核也会自动关闭它打开的所有文件。但是对于一个长年累月运行的程序(比如网络服务器),打开的文件描述符一定要记得关闭,否则随着打开的文件越来越多,会占用大量文件描述符和系统资源。

 

4.如何判断一个打开的文件描述符是否位于文件尾呢?

 

 

5.编译以下代码

#include<stdio.h>

int main()

{

        char buff[5];

        int feof1,feof2,feof3;

        int count1,count2,count3;

        FILE *fp=fopen("test.txt","r");

        count1=fread(buff,1,5,fp);

        feof1=feof(fp);

        count2=fread(buff,1,5,fp);

        feof2=feof(fp);

        count3=fread(buff,1,5,fp);

        feof3=feof(fp);

        printf("%d,%d,%d\n",count1,count2,count3);

        printf("%d,%d,%d\n",feof1,feof2,feof3);

        return 0;

}

 

用以下命令生成输入文件test.txt

echo "1234">test.txt

编译后执行./a.out,结果是什么?请解释原因?为什么这个代码没有问题2中的错误?

答:运行后结果是:”5,0,0\n0,1,1”

     不存在2中问题的原因:

Linux

标签:

原文地址:http://www.cnblogs.com/linduan/p/5457305.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!