Linux
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Linux,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1759字,纯文字阅读大概需要3分钟。
内容图文
![Linux](/upload/InfoBanner/zyjiaocheng/1227/7e5bfcd2ce9b45c18b18c602e0a284f6.jpg)
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中问题的原因:
原文:http://www.cnblogs.com/linduan/p/5457305.html
内容总结
以上是互联网集市为您收集整理的Linux全部内容,希望文章能够帮你解决Linux所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。