C - 程序自动设置粘滞位?

时间:2015-09-18 03:56:08

标签: c io permissions

我有这个代码,我正在从一个文件中读取并向另一个文件写入我读过的内容。出于某种原因,我经常遇到权限错误,但只有当我创建一个新文件并尝试写入时;如果我删除了读写的块,它会创建文件并且具有正确的权限。但是,一旦我尝试编写,创建文件的权限就像这样:rwSr-Sr--

 if ((dst_fd = open(dst_path, O_RDWR | O_CREAT)) < 0){
       close(src_fd);
       exit(1);
 }
 while ((n = read(src_fd, buf, BUF_SIZE)) > 0){
      if (write(dst_fd, buf, n) < 0){
          exit(1);
      }
 }

为什么会这样?我似乎无法找到我改变的东西,这使得这个开始发生但我不认为我真的做了那么糟糕的事情。

1 个答案:

答案 0 :(得分:3)

检查文档是否已打开。签名是:

int _open(
   const char *filename,
   int oflag [,
   int pmode] 
);

注意pmode。它是可选的,你没有使用它。

您正在使用oflag,它会通知您打算执行的操作,但不设置任何权限。相反,默认情况下将应用umask建立的默认权限。如果要控制权限,还需要包含pmode。

open的文档说明在使用O_CREAT时需要使用pmode。

因此,请添加所需的权限,通常为_S_IREAD | S_IWRITE

像:

open(dst_path, O_RDWR | O_CREAT, _S_IREAD | S_IWRITE)) 

您可能需要检查与这些标志关联的标头:

<fcntl.h>, <sys\types.h>, <sys\stat.h>