创建文件后无法打开?C语言IO模块调用异常问题咨询
问题分析与解决方案
核心错误:open权限参数格式错误
你的MyOpen函数中,open的第三个权限参数用了十进制777,但C语言规定文件权限必须以八进制数表示(需加0前缀)。十进制777转成八进制是01411,这会导致生成的文件权限完全不符合预期——比如实际权限可能变成---x--t--x,当前用户根本没有读写权限。
这就解释了现象:
access("./a.txt", F_OK)返回0(文件确实存在)- 但
open调用失败返回-1,因为当前用户没有该文件的读写权限。
其他潜在问题
除了核心错误,代码还有几处需要修正:
MyRead和MyWrite中调用read/write时用了未定义变量size,应该替换为函数参数len。open调用未做错误检查,建议添加判断并打印错误信息,方便调试。- 权限设置
0777过于宽松,存在安全风险,建议根据实际需求设置0666等合理权限(最终权限会被系统umask修正)。
修正后的代码示例
MyIo.c 修正片段
int MyOpen (char* f) { // 使用八进制权限参数 int fd = open(f, O_RDWR | O_CREAT, 0777); // 可选:添加错误调试信息 if (fd == -1) { perror("MyOpen failed"); } return fd; } char* MyRead (int fd, char* buf, int len) { // 替换未定义的size为参数len read(fd, buf, len); return buf; } void MyWrite (int fd, char* buf, int len) { // 替换未定义的size为参数len write(fd, buf, len); }
调试技巧
如果修正后仍有问题,通过perror可以直接看到open失败的具体原因(比如权限不足、路径无效等),快速定位问题。
内容的提问来源于stack exchange,提问作者An Assembler
相关产品推荐
相关产品推荐

