当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 8 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 网上找到类似的但是没有解决的…、真心求知道的指教一下
帖子发表于 : 2013-03-18 23:07 

注册: 2012-09-16 23:41
帖子: 6
系统: win7
送出感谢: 0 次
接收感谢: 0 次
纠结这个问题两天了,也试过别人的电脑,有的成功运行,有的运行失败。
就只是一个很简单的函数: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中执行,结果一样。
已经弄了两个晚上了,各种尝试过,但是结果很桑心。真心希望懂的人告知一下。
学校断网了,大家的回信明天再回复,在这里先谢谢了!!

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


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 网上找到类似的但是没有解决的…、真心求知道的指教一下
帖子发表于 : 2013-03-19 12:44 

注册: 2012-09-16 23:41
帖子: 6
系统: win7
送出感谢: 0 次
接收感谢: 0 次
:em20 求高手回应


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 网上找到类似的但是没有解决的…、真心求知道的指教一下
帖子发表于 : 2013-03-19 14:00 
头像

注册: 2008-08-13 8:48
帖子: 26391
地址: 东海硇州,一双管钥。
系统: Fundu i64
送出感谢: 50
接收感谢: 344
表示open与文件的权限无关,那不过是访问权限而已,假如是要修改文件权限的话,倒可以在open之后加入这行代码:
代码:
fchmod(fd ,S_IRUSR |S_IWUSR);

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


_________________
◎当我站在道德的高度上俯视别人的时候,发现自己是多么渺小。
♥执着但不偏激,反对而不排斥,坚决捍卫矛盾体的存在方式。
★★★天气预报★★★
fcitx-yatable一个可以使用的码表输入法
[教程]几个实例攻克软件编译难关
Gentoo Development Guide
字体相关


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 网上找到类似的但是没有解决的…、真心求知道的指教一下
帖子发表于 : 2013-03-19 17:47 

注册: 2012-09-16 23:41
帖子: 6
系统: win7
送出感谢: 0 次
接收感谢: 0 次
我试过open的另外一个函数模型了。
open("tmp.txt", O_WRONLY|O_CREAT|O_EXCL, S_IRUSR | S_IWUSR);
但是情况也是一样的。
我上面写的函数在同学的电脑上运行时正常的。文件权限不是用该跟用户的umask相关么?
按理说创建的文件属性应该是umask的反码。 :em06


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 网上找到类似的但是没有解决的…、真心求知道的指教一下
帖子发表于 : 2013-03-19 18:03 

注册: 2012-09-16 23:41
帖子: 6
系统: win7
送出感谢: 0 次
接收感谢: 0 次
我做过了以下几种测试:
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 真心觉得无计可施了。


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 网上找到类似的但是没有解决的…、真心求知道的指教一下
帖子发表于 : 2013-03-19 19:11 
头像

注册: 2010-10-29 16:15
帖子: 16
送出感谢: 0 次
接收感谢: 0 次
open 创建文件时, 必须带第三个函数, 否则它取堆栈上mode(第三个参数)位置的值, 故创建的文件权限无意义. 第一种使用方法是错误的

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


页首
 用户资料  
 
7 楼 
 文章标题 : Re: 网上找到类似的但是没有解决的…、真心求知道的指教一下
帖子发表于 : 2013-03-19 21:31 

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


页首
 用户资料  
 
8 楼 
 文章标题 : Re: 网上找到类似的但是没有解决的…、真心求知道的指教一下
帖子发表于 : 2013-03-25 17:01 

注册: 2012-09-16 23:41
帖子: 6
系统: win7
送出感谢: 0 次
接收感谢: 0 次
这几天一直在忙,没能上来看看,虽然也没有更多人回复……
我试验过用标准文件操作函数fopen来创建tmp.txt,发现创建出来的权限是正常的 0644
学习linux的道路还是很漫长的、谢谢各位费心看我的帖子了。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 8 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译