分页: 1 / 1

网上找到类似的但是没有解决的…、真心求知道的指教一下

发表于 : 2013-03-18 23:07
plan041
纠结这个问题两天了,也试过别人的电脑,有的成功运行,有的运行失败。
就只是一个很简单的函数:open函数。
是一个各大教学网站都有的范例:用open打开一个不存在的文件,含O_CREAT|O_EXCL标识符则能创建文件。
但是实际情况如下
----------------------代码 test.c----------------------------
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

void main()
{
int fd, size;
char s[] = "test program.\n", buf[50];
fd = open("tmp.txt",O_WRONLY | O_CREAT | O_EXCL);
write(fd, s, sizeof(s));
close(fd);

fd = open("tmp.txt", O_RDONLY);
size = read(fd, buf, sizeof(buf));
close(fd);

printf("%s", buf);
}
------------------------------------------------------------
经过
$ gcc test.c -o test
$ ./test
之后得到的结果是空字符。
$ ls -l 查看tmp.txt文件权限为
---------- ... tmp.txt
文件内无任何内容。
查看过机子的umask,为0002。
试过 sudo ./test 执行程序,结果显示正常,但是tmp.txt文件权限不变,文件内依然无内容。
我的电脑环境: 双系统ubuntu 12.10与win7。
程序试过在ubuntu系统中执行,也试过在win7的虚拟机ubuntu中执行,结果一样。
已经弄了两个晚上了,各种尝试过,但是结果很桑心。真心希望懂的人告知一下。
学校断网了,大家的回信明天再回复,在这里先谢谢了!!

虽然有可能是我电脑问题,但是请明示到底是什么问题呢,可以尝试什么方法解决…、

Re: 网上找到类似的但是没有解决的…、真心求知道的指教一下

发表于 : 2013-03-19 12:44
plan041
:em20 求高手回应

Re: 网上找到类似的但是没有解决的…、真心求知道的指教一下

发表于 : 2013-03-19 14:00
YeLee
表示open与文件的权限无关,那不过是访问权限而已,假如是要修改文件权限的话,倒可以在open之后加入这行代码:

代码: 全选

fchmod(fd ,S_IRUSR |S_IWUSR);
至于文件为空的问题,表示我也不是很了解,可能是因为O_EXCL的原因吧,致使文件存在之后出现错误,这时候你应该检查一下fd是否为-1的。当然,直接把O_TRUNC换上去也是一种办法。

Re: 网上找到类似的但是没有解决的…、真心求知道的指教一下

发表于 : 2013-03-19 17:47
plan041
我试过open的另外一个函数模型了。
open("tmp.txt", O_WRONLY|O_CREAT|O_EXCL, S_IRUSR | S_IWUSR);
但是情况也是一样的。
我上面写的函数在同学的电脑上运行时正常的。文件权限不是用该跟用户的umask相关么?
按理说创建的文件属性应该是umask的反码。 :em06

Re: 网上找到类似的但是没有解决的…、真心求知道的指教一下

发表于 : 2013-03-19 18:03
plan041
我做过了以下几种测试:
1、直接gcc 编译test.c, 然后运行无结果(运行环境ubuntu12.10,双系统及虚拟机),还有一种结果是乱码(虚拟机ubuntu12.04)。
2、尝试过两种open的函数模型,结果一致,同一种运行环境下,并且确认已经删除了原本生成的tmp.txt文件和test执行文件。
3、在不同权限下进行,在普通用户下无正确结果,在sudo前置命令(及root登陆状态下)执行./test得到正确结果,但是执行结束后文件内依然无内容。
4、将自己虚拟机下产生的test.c和test文件共享到电脑上发给同学运行,同学电脑上编译我生成的test.c文件,运行结果正常,直接运行我发送的test文件,结果与我虚拟机上结果一致。

初步猜测、是不是我的gcc出了问题?
但是我已经尝试过在win7虚拟机上重装ubuntu(12.04与12.10都重装过),未改动系统任何文件的情况下,直接创建test.c然后用系统自带gcc编译,结果一样。
:em20 真心觉得无计可施了。

Re: 网上找到类似的但是没有解决的…、真心求知道的指教一下

发表于 : 2013-03-19 19:11
lifenglifeng001
open 创建文件时, 必须带第三个函数, 否则它取堆栈上mode(第三个参数)位置的值, 故创建的文件权限无意义. 第一种使用方法是错误的

umask 会屏蔽对应位置的权限. 会不会楼主无意中修改了文件创建模式屏蔽字

Re: 网上找到类似的但是没有解决的…、真心求知道的指教一下

发表于 : 2013-03-19 21:31
plan041
多谢两位回答…、可是我的看法是这样的:
open函数如果创建文件时不加第三个参数,那么创建的文件权限是默认的(在我同学电脑上尝试的时候,创建出来的文件权限是666)。
我在调用test之前和之后有查看过机子的umask…、并没有发现是异常的。
而且我在sudo 和root权限下执行test创建出来的文件确实也是没有权限的。
这个是比较诧异的地方…、 因为sudo和root权限下执行test,输出的内容是正常,说明写入和读取都是正常进行了,可是为什么tmp.txt文件内仍没有内容呢……

Re: 网上找到类似的但是没有解决的…、真心求知道的指教一下

发表于 : 2013-03-25 17:01
plan041
这几天一直在忙,没能上来看看,虽然也没有更多人回复……
我试验过用标准文件操作函数fopen来创建tmp.txt,发现创建出来的权限是正常的 0644
学习linux的道路还是很漫长的、谢谢各位费心看我的帖子了。