我在2.6.16-rc3下面有一个小程序,它使用busy box(在jffs2文件系统上)。 如果我多次运行程序,它会在第二次开始失败。程序退出时,描述符应自动关闭,下次重新开始,对吧?
为什么我有时会得到-1? (注意 - 在我的Fedora Linux PC上,它工作正常)
root@badge 07:29:32 ~ >touch Hello.txt
root@badge 07:29:37 ~ >./a.out
FP = 3
root@badge 07:29:38 ~ >./a.out
FP = -1
root@badge 07:29:40 ~ >./a.out
FP = 3
root@badge 07:29:41 ~ >./a.out
FP = -1
root@badge 07:29:42 ~ >./a.out
FP = 3
root@badge 07:29:43 ~ >./a.out
FP = 3
root@badge 07:29:43 ~ >./a.out
FP = -1
root@badge 07:29:45 ~ >
#include <stdio.h>
int main()
{
int fp;
fp = open ("Hello.txt");
printf("FP = %d\n", fp);
return 0; // No close() is used. On exit, it shall be closed.
}
-rw-r--r-- 1 root root 0 Sep 20 07:22 Hello.txt
答案 0 :(得分:8)
您没有遵守open()
电话的合同。手册页(在Linux上)说明了这一点:
SYNOPSIS
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
int creat(const char *pathname, mode_t mode);
正如您所看到的,您忘记包含正确的标题,open()
也会使用flags参数,您可以在其中声明读/写权限等。如果这样,您将得到一个传递给open()
的神秘参数,这是当时堆栈或寄存器中的任何内容。