程序1

#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
int main(int argc, char **argv)
{
   int fd1, fd2;
   fd1 = open("dup1.txt", O_RDWR | O_CREAT| S_IREAD | S_IWRITE);
   printf("\nOriginal fd = %d", fd1);
   if(fd1 == -1){
     printf("\nFATAL Error\n");
     exit(1);
   }
}

程序2
#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
int main(int argc, char **argv)
{
   int fd1, fd2;
   fd1 = open("dup1.txt", O_RDWR | O_CREAT, S_IREAD | S_IWRITE);
   printf("\nOriginal fd = %d", fd1);
   if(fd1 == -1){
     printf("\nFATAL Error\n");
     exit(1);
   }
}

程序1返回FD,1,如果文件已经存在(当它不工作时很好),但是第一个程序下的程序2工作得很好。区别在于选项标志的位置。

最佳答案

在我的机器上,S_IWRITE的值与O_EXCL的值相同。程序:

int main() {
    printf("%x %x\n", S_IREAD, S_IWRITE);
    printf("%x\n", O_EXCL);

    return 0;
}

给予:
100 80
80

因此,我想,将旗S_IWRITEO_CREAT现在指定的效果与O_CREAT | O_EXCL相同,如果文件已经存在,这会导致open失败。
但是,我认为您应该正确使用系统调用的参数。

10-01 06:17