0

我在输入 open 时遇到问题如果我的第一个参数是路径,我会得到以下输出:

打开时出错:没有这样的文件或目录

但是如果它的文件名没有错误,如何修复它?代码如下:

#include<sys/types.h>   //Primitive system data types for abstraction of implementation-dependent data types.
                        //POSIX Standard: 2.6 Primitive System Data Types <sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdlib.h>
#include<stdio.h>
#include<errno.h>

char buf1[]="abcdefghij";
char buf2[]="ABCDEFGHIJ";

int main(int argc, char *argv[])
{
int fd;
if( (fd=open(argv[1],O_CREAT|O_TRUNC|O_WRONLY,S_IRUSR|S_IWUSR))<0) {
    printf("\nError %d en open",errno);
    perror("\nError en open");
    exit(-1);
}
if(write(fd,buf1,10) != 10) {
    perror("\nError en primer write");
    exit(-1);
}

if(lseek(fd,40,SEEK_SET) < 0) {
    perror("\nError en lseek");
    exit(-1);
}

if(write(fd,buf2,10) != 10) {
    perror("\nError en segundo write");
    exit(-1);
}

return 0;
}

测试顺序为:

root@ubuntu:/home/pablo/...# ./tarea1 /home/pablo/hello > temp ; cat temp
root@ubuntu:/home/pablo/...# ./tarea1 /home/pablo/>hello ; cat hello 
Error en open: Is a directory 
4

2 回答 2

0

您的第二个测试序列是:

# ./tarea1 /home/pablo/>hello

这将更清楚地写成:

# ./tarea1 /home/pablo/ >hello

shell 为您的程序提供目录名称,并在当前目录中/home/pablo/创建一个文件。hello程序的任何标准输出都会写入文件。当您的程序试图打开目录进行写入时,它会失败——甚至root不允许在目录中写入。(您可以打开一个目录进行读取,但实际上不能从中读取;这对于各种*at()功能(例如openat())很有用,但在其他方面则不然。)

如果你真的想要>在你的文件名中,请将整个名称用引号引起来:

# ./tarea1 "/home/pablo/>你好"

但是,您并不真正想要>文件名中的 a ;它只是让生活变得困难(不如文件名中的换行符那么糟糕,但关闭)。

于 2013-11-15T02:32:53.757 回答
0

你还没有说你是否使用Linux。但我猜你是。

Linux open 有一个非常烦人的特性,由于某种原因该文件不存在并且您使用没有第三个模式参数的 open 版本,它无法创建文件。至少这是我发现的。但是,如果该文件确实存在并且具有适当的权限,则 2 参数 open 调用应该成功。

解决方法是将 open call 更改为:

fd=open(argv[1],O_CREAT|O_TRUNC|O_WRONLY,S_IRUSR|S_IWUSR, S_IRWXU)

顺便说一句,我希望您知道,如果没有参数,程序会将 null 传递给 open 调用。

于 2013-12-09T21:17:26.693 回答