linux下c文件描述符问题(:Bad file descriptor)

jiangrains 2009-07-21 05:58:59
下面是一个简单的小程序,用creat创建一个文件,获得文件描述符fd,之后write进一些字符,但是用read时,却报错:
read error !
: Bad file descriptor

源代码如下:
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main()
{
int fd;
if((fd=creat("file1.c",S_IRWXU))==-1){
perror("creat error !\n");
exit(0);
}else{
//int fd=open("file1.c",O_RDWR);
if(write(fd,"ni hao !",sizeof("ni hao !")-1)==-1){
perror("write error !\n");
exit(0);
}else{
if(write(fd,"jiangdunchuan !",sizeof("jiangdunchuan !"))==-1){
perror("error !\n");
exit(0);
}
printf("successful !\n");
}
char buff[100];
//int fd2=open("file1.c",O_RDWR);
if(read(fd,buff,100)==-1){
perror("read error !\n");
exit(0);
}else{
printf("%s\n",buff);
printf("ok\n");
}
}
return 0;
}

编译通过,运行结果:
read error !
: Bad file descriptor
如果将fd2的注释去掉,read改为(read(fd2,buff,100)==-1)时,运行结果正常!

望各位朋友指教,谢谢!

...全文
16286 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
yxqlf 2011-01-14
  • 打赏
  • 举报
回复
creat()只能以只写的方式打开创建的文件,而你在程序中进行了读操作,所以会出问题,你如果用open()函数以O_WRONLY方式打开,应该会出现同样的问题
jiangrains 2009-07-21
  • 打赏
  • 举报
回复
ok!小问题终于要结贴了!
最后出现空白的原因在于文件指针!粗心了!
但是有一点不明白的是creat("jiangdunchuan.c",0777)
与open("jiangdunchuan.c", O_RDWR|O_CREAT|O_TRUNC,0777)之间在权限方面有什么不同?当我用后者就正常,用creat时就出现最初的问题!
jiangrains 2009-07-21
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 showman 的回复:]
有啥奇怪的,现象正常,结贴。
下次讨论。
[/Quote]
呵呵…现在还是没有弄明白里面的权限问题~不过还是感谢各位!
至于结贴,先等等~
ShowMan 2009-07-21
  • 打赏
  • 举报
回复
有啥奇怪的,现象正常,结贴。
下次讨论。
once_and_again 2009-07-21
  • 打赏
  • 举报
回复
观察 奇怪
没有 系统 测试...
jiangrains 2009-07-21
  • 打赏
  • 举报
回复
回复8楼:
初始化之后的输出是一片空白!!似乎根本没有读到东西!
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
int fd;
if((fd=open("jiangdunchuan.c", O_RDWR|O_CREAT|O_TRUNC,0777))==-1){
perror("creat error !\n");
exit(0);
}else{
//int fd=open("jiangdunchuan.c",O_RDWR);
if(write(fd,"ni hao !",sizeof("ni hao !")-1)==-1){
perror("write error !\n");
exit(0);
}else{
if(write(fd,"jiangdunchuan !",sizeof("jiangdunchuan !"))==-1){
perror("error !\n");
exit(0);
}
printf("successful !\n");
}
char buff[100];
memset(buff,0,100);
//int fd2=open("jiangdunchuan.c",O_RDWR);
if(read(fd,buff,100)==-1){
perror("read error !\n");
exit(0);
}else{
printf("%s\n",buff);
printf("ok\n");
}
}
return 0;
}

输出为:
successful !

ok
到现在感觉有点奇怪了?
ShowMan 2009-07-21
  • 打赏
  • 举报
回复
乱码是因为你的数组没有初始化!
char buff[100]={0};
jiangrains 2009-07-21
  • 打赏
  • 举报
回复
回复5楼:
能不能说详细一点呢?
似乎我creat的时候用的是S—IRWXU,表明文件所有者具有可读可写以及可执行的权限,难道这种权限还不足以让自己read它吗?
jiangrains 2009-07-21
  • 打赏
  • 举报
回复
回复4楼:
按你的代码替换之后,没有出现read error ! : Bad file descriptor 错误,但是read函数之后,输出的却是一堆乱码,用more jiangdunchuan.c得到的却是正确的内容(ni hao ! jiangdunchuan ! ),这里似乎又存在编码的问题了~~由于初学linux,还请指教~多谢
dalier149 2009-07-21
  • 打赏
  • 举报
回复
创建文件的权限与打开文件的权限的区别~
ShowMan 2009-07-21
  • 打赏
  • 举报
回复
晕,没发出去
if((fd=open("jiangdunchuan.c", O_RDWR|O_CREAT|O_TRUNC,0777))==-1)

文件权限的问题。
汗晕倒 2009-07-21
  • 打赏
  • 举报
回复
为什么要用creat
用open好阿
ShowMan 2009-07-21
  • 打赏
  • 举报
回复
日,真是这样,好好想想
jiangrains 2009-07-21
  • 打赏
  • 举报
回复
开始的代码格式化之后:
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main()
{
int fd;
if((fd=creat("jiangdunchuan.c",S_IRWXU))==-1){
perror("creat error !\n");
exit(0);
}else{
//int fd=open("jiangdunchuan.c",O_RDWR);
if(write(fd,"ni hao !",sizeof("ni hao !")-1)==-1){
perror("write error !\n");
exit(0);
}else{
if(write(fd,"jiangdunchuan !",sizeof("jiangdunchuan !"))==-1){
perror("error !\n");
exit(0);
}
printf("successful !\n");
}
char buff[100];
//int fd2=open("jiangdunchuan.c",O_RDWR);
if(read(fd,buff,100)==-1){
perror("read error !\n");
exit(0);
}else{
printf("%s\n",buff);
printf("ok\n");
}
}
return 0;
}
OS error code 0: Success 操作系统错误代码0:成功 OS error code 1: Operation not permitted 操作系统错误代码1:操作不允许 OS error code 2: No such file or directory 操作系统错误代码2:没有这样的文件或目录 OS error code 3: No such process 操作系统错误代码3:没有这样的过程 OS error code 4: Interrupted system call 操作系统错误代码4:中断的系统调用 OS error code 5: Input/output error 操作系统错误代码5:输入/输出错误 OS error code 6: No such device or address 操作系统错误代码6:没有这样的设备或地址 OS error code 7: Argument list too long 操作系统错误代码7:参数列表太长 OS error code 8: Exec format error 操作系统错误代码8:执行格式错误 OS error code 9: Bad file descriptor 操作系统错误代码9:坏的文件描述符 OS error code 10: No child processes 操作系统错误代码10:无子过程 OS error code 11: Resource temporarily unavailable 操作系统错误代码11:资源暂时不可用 OS error code 12: Cannot allocate memory 操作系统错误代码12:无法分配内存 OS error code 13: Permission denied 操作系统错误代码13:权限被拒绝 OS error code 14: Bad address 操作系统错误代码14:错误的地址 OS error code 15: Block device required 操作系统错误代码15:需要块设备 OS error code 16: Device or resource busy 操作系统错误代码16:设备或资源忙 OS error code 17: File exists 操作系统错误代码17:文件已经存在 OS error code 18: Invalid cross-device link 操作系统错误代码18:无效的跨设备链接 OS error code 19: No such device 操作系统错误代码19:没有这样的设备 OS error code 20: Not a directory 操作系统错误代码20:不是一个目录 OS error code 21: Is a directory 操作系统错误代码21:是一个目录 OS error code 22: Invalid argument 操作系统错误代码22:无效参数 OS error code 23: Too many open files in system 操作系统错误代码23:打开太多的文件系统 OS error code 24: Too many open files 操作系统错误代码24:打开的文件太多 OS error code 25: Inappropriate ioctl for device

23,110

社区成员

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

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