【发布时间】:2017-09-27 18:40:21
【问题描述】:
所以我有以下代码。 str_arr[] 仅包含控制台命令 ex ls、sort.. 和文件名的组合。并且 execute() 派生出一个子进程。
for(int y=0; y<i-1; y++){
if(type_arr[y]==0){
}
else if(type_arr[y]==1){
}
else if(type_arr[y]==2){
int fw1=open(str_arr[y+1], O_WRONLY | O_APPEND | O_CREAT |S_IRWXU);
int sv_out1=dup(1);
dup2(fw1, 1);
close(fw1);
execute(str_arr[y]);
dup2(sv_out1, 1);
}
else if(type_arr[y]==3){
int fw=open(str_arr[y+1], O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IRGRP | S_IWGRP | S_IWUSR);
int sv_out=dup(1);
dup2(fw, 1);
close(fw);
execute(str_arr[y]);
dup2(sv_out, 1);
}
}
当type_arr[y]==3时,如果文件存在,代码应该创建或覆盖文件。这行得通。但是,当 type_arr[y]==2 代码应该创建或附加文件时,这不起作用,实际上它只会在文件存在时正常打印到控制台(使用 ls),如果文件确实存在它确实创建了一个新文件。这里有什么问题?这些 O_FLAGS 应该附加或创建文件吗?
【问题讨论】:
-
S_IRWXU在你的开放模式下在做什么?你的错误检查在哪里? -
S_IRWXU 这样做:00700 用户(文件所有者)具有读、写和执行权限
-
是的。这些是权限位。为什么将它们作为开放模式的一部分传递?
-
因为如果也必须创建,当我没有把它创建为只读模式时。
-
你说不通。现在您已将
O_CREAT添加到打开模式,您还需要第三个参数(新文件的文件权限)。