2
#include<apue.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>

int main(int argc , char *argv[])
{
    int fd = open("test.txt",O_WRONLY | O_CREAT | O_TRUNC);
    int pid,status;
    const char *str_for_parent = "str_for_parent\n";
    const char *str_for_child = "str_for_child\n";
    if ((pid = fork()) < 0)
        err_sys("fork error");
    else if (pid == 0)
    {
        write(fd,str_for_child,strlen(str_for_child)+1);
        _exit(0);
    }
    wait(&status);
    write(fd,str_for_parent,strlen(str_for_parent)+1);

    return 0;
}

test.txtopen()によって作成されます。しかし、パーミッション( )は、システム内のまたは他のソフトウェアによって作成された---------xファイル()とは異なります。私のumask-rw-rw-r--touch0002

4

2 に答える 2

5

open実際には (オプションの) 3 番目のパラメーターを取ります。

int open(const char *pathname, int flags, mode_t mode);

新しいファイルのモードは、 (つまり、 )の ANDmodeと逆に設定されます。を渡していないため、ガベージに初期化されており、結果として間違ったモードになっています。umaskmode & ~umaskmode

通常、 を渡す場合は、他のモードを使用する特定の理由がない限り (たとえば、umask の設定に関係なく、他のユーザーがファイルを読み取れないようにする場合) 、 ofO_CREATを渡す必要があります。 .mode0666

于 2012-10-04T06:37:19.657 に答える
2

O_CREATにフラグを指定する場合open()は、3 番目のパラメーターも指定する必要がありmodeます。このパラメーターは、現在の umask と組み合わせて、作成されたファイルの許可ビットを設定します。

特に実行可能ファイルを作成する場合を除き、ほとんどの場合、次の0666パラメーターを使用する必要があります。

int fd = open("test.txt",O_WRONLY | O_CREAT | O_TRUNC, 0666);

これにより、 と同じ結果が得られるはずですtouch。C の先頭のゼロは 8 進数の定数を示すことに注意してください。

于 2012-10-04T06:37:12.073 に答える