所以我有以下代码。 str_arr []只包含控制台命令ex ls,sort ..和filenames的组合。并执行()分叉子进程。
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应该追加或创建文件吗?
答案 0 :(得分:1)
要附加或创建文件,请使用:
int fw1=open(str_arr[y+1], O_WRONLY | O_APPEND | O_CREAT, FILE PERMISSIONS);
并使用第三个参数作为文件权限。感谢@kaylum,Charles Duffy,melpomene。