10
umask(0);

fd = open("/dev/null", O_RDWR);

ここにありman 2 umaskます:

umask() sets the calling process’s file mode creation mask (umask) to mask & 0777.

openしかし、 を呼び出すと、モード パラメータも提供されるため、私には意味がありません。

それで、のポイントはumask何ですか?

4

4 に答える 4

6

umask は、ファイル システム操作で使用されるすべてのモードに適用されます。マニュアルからopen(2)

作成したファイルのパーミッションは(mode & ~umask)

したがって、umask を 1 回呼び出すだけで、すべての作成ファイルのモードに影響を与えることができます。

これは通常、プログラムが作成するファイル/ディレクトリのデフォルト許可をユーザーが上書きできるようにする場合に使用されます。偏執的なユーザー (または root) は umask を に設定できます。これは、 in0077を指定しても、現在のユーザーだけがアクセスできることを意味します。0777open(2)

于 2011-06-01T09:23:23.640 に答える
5

私はこれが古い質問であることを知っていますが、ここに私の2セントがあります:

共有メモリ オブジェクトの権限

私は共有メモリオブジェクトを作成しようとしていました:

int shm_open(const char *name, int oflag, mode_t mode); 

結果として得られた共有メモリには、モード引数に設定された権限がありませんでした。そのため、shm_open のマニュアル ページを読んで、open 関数のマニュアル ページにたどり着きました。そこには、次のように書かれています。

mode は、新しいファイルが作成された場合に使用するパーミッションを指定します。フラグで O_CREAT が指定されている場合、この引数を指定する必要があります。O_CREAT が指定されていない場合、モードは無視されます。有効なパーミッションは、通常の方法でプロセスの umask によって変更されます。作成されたファイルのパーミッションは (mode & ~umask) です。このモードは、新しく作成されたファイルの将来のアクセスにのみ適用されることに注意してください

そこで、次のように umask を変更しようとしました。

mode_t umask(mode_t mask); 

しかし、それもうまくいかなかったので、さらにグーグルで検索した後、gnu.orgでこの許可設定ドキュメントを見つけました

推奨事項:

プログラムでファイルを作成し、そのアクセス許可のために umask をバイパスする必要がある場合、これを行う最も簡単な方法は、umask を変更するのではなく、ファイルを開いた後に fchmod を使用することです。実際、umask の変更は通常、シェルによってのみ行われます。umask 関数を使用します。

そして fchmod を使用すると、私の機能は私が望むように機能しました:)彼女は次のとおりです:

int open_signals_shmem(struct signal_shmem **shmem, int size)
{
    int fd, ret;
    void *ptr;

    *shmem = NULL;
    ret = 1;

    fd = shm_open(SIGNALS_SHMEM_NAME, O_RDWR | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO);
    if (fd == -1)
    {
        printf("error: signals shmem could not be allocated (%s, errno=%d)\n", SIGNALS_SHMEM_NAME, errno);
    }
    else
    {
        // Change permissions of shared memory, so every body can access it
        fchmod(fd, S_IRWXU | S_IRWXG | S_IRWXO);

        if (ftruncate(fd, size) == -1)
        {
            printf("error: signals shmem could not be truncated (%s, errno=%d)\n", SIGNALS_SHMEM_NAME, errno);
        }
        else
        {
            ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
            if (ptr == MAP_FAILED)
            {
                printf("error: signals shmem could not be mapped (%s, errno=%d)\n", SIGNALS_SHMEM_NAME, errno);
            }
            else
            {
                *shmem = ptr;
                ret = 0;
            }
        }
    }
    return ret;
}
于 2015-02-20T17:15:06.323 に答える
1

この記事を引用:

umask の目的は、ユーザーが新しく作成されたファイルとディレクトリに与えられるアクセス許可に影響を与えることを可能にすることです。ユーザーにとって適切だったものがデーモンにとって必ずしも適切であるとは限らないため、デーモンはこの設定の影響を受けないようにする必要があります。

場合によっては、umask をゼロ以外の値に設定した方が便利な場合があります。これも同様に受け入れられます。重要な点は、与えられた値を単に受け入れるのではなく、デーモンが値を制御するということです。

于 2011-06-01T09:01:39.110 に答える