1

openシステムコールを使用して完全なアクセス許可(777)でファイルを作成していますが、作成すると、ls -lアクセス許可のみが(755)として表示されます。ファイルパーミッションが777ではない理由を教えてください。

コード

#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

int main()
{
        int fd;

        /* Creates a file with full permission*/
        fd = open("test", O_CREAT | O_RDWR | O_APPEND, 0777);

        if (fd = -1)
        {
                return -1;
        }

        close(fd);
}

出力

     $ ls -l
    -rwxr-xr-x 1 ubuntu ubuntu    0 2012-09-19 11:55 test
4

3 に答える 3

7

umask;と呼ばれるシステムによって維持される値があります。これは、PID(プロセスID)またはEUID(実効ユーザーID)と同様に、プロセスのプロパティです。022(8進数)に設定されます。これは、システムが作成されたファイルからグループおよびその他の書き込み権限を削除する必要があることを示します。

指定したモードが変更されないように、umask(0);使用する前に呼び出すことができます。それが問題であることを示すために、確かにこれを行う必要があります。ただし、一般的には、ユーザーの選択を優先させるのが最善です。プログラムが私のumask設定に従わない場合、私は非常に厄介になります。問題を見つけて確認した後は、二度と使用されない傾向があります。open()open()umaskumask

シェルには、umask使用できる(組み込みの)コマンドもあります。値は022適切なデフォルトです。ほとんどの場合、誰もが自分のファイルに書き込むことは望ましくありません。

于 2012-09-19T06:31:57.233 に答える
3

作成されたファイルのアクセス許可は、プロセスの現在のファイルによって制限されumaskます。現在のファイルは現在のファイルでumaskある022ため、グループおよびワールドの書き込みはデフォルトで常に無効になっています。(ほとんどの場合、これは良いことです。)グループおよび誰でも書き込み可能なファイルが本当に必要な場合は、umask(0)このファイルの作成中に一時的に設定する必要があります(システムコールによって返された古い値を必ず保存してください。後で元に戻します!)、または「手動で」を使用してファイルのアクセス許可を設定しますchmod()

于 2012-09-19T06:31:58.550 に答える
0

umaskマスクの元の値を返すので、一時的にリセットするには、次のことを行う必要があります。

#include <sys/types.h>
#include <sys/stat.h>

mode_t old_mask = umask(0);
...
umask(old_mask);

ただし、ファイルを開いたfchmod に使用することをお勧めします。これにより、プロセスグローバル状態の変更の問題を回避できます。

fd = open("test", O_CREAT | O_RDWR | O_APPEND, 0777);
if (fd < 0) { ... }
int rv = fchmod(fd, 0777);
if (rv < 0) { /* fchmod errored */ }
于 2019-08-08T12:31:22.603 に答える