0

私は最近UNIXを学び始め、ファイルに関連するいくつかの簡単なプログラムを試しています。関数F_SETFLを使用して、コードを使用してファイルのアクセス許可を変更しようとしています。書き込み権限のみでファイルを作成しましたが、コードを使用して権限を更新しようとしています。しかし、すべての権限がリセットされています。

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

int main(void) {

int fd =0;
int fileAttrib=0;

/*Create a new file*/

fd = creat("/u01/TempClass/apue/file/tempfile.txt",S_IWUSR);

fileAttrib = fcntl(fd,F_GETFL,0);
if(fileAttrib < 0 ) {
    perror("An error has occurred");
}

printf("file Attribute is %d \n",fileAttrib);

switch(fileAttrib) {

case O_RDONLY:
    printf("Read only attribute\n");
    break;
case O_WRONLY:
    printf("Write only attribute\n");
    break;
case O_RDWR:
    printf("Read Write Attribute\n");
    break;
default:
    printf("Somethng has gone wrong\n");
}

int accmode = 0;

//accmode = fileAttrib & O_ACCMODE;
accmode = 777;

fileAttrib = fcntl(fd,F_SETFL,accmode);
if(fileAttrib < 0 ) {
    perror("An error has occurred while setting the flags");
}

printf("file Attribute is %d \n",fileAttrib);

/*Print the new access permissions*/

switch(fileAttrib) {

case O_RDONLY:
    printf("New Read only attribute\n");
    break;
case O_WRONLY:
    printf("New Write only attribute\n");
    break;
case O_RDWR:
    printf("New Read Write Attribute\n");
    break;
default:
    printf("New Somethng has gone wrong\n");
}

exit(0);
}

そしてこれは私の出力です

ファイル属性は1です

属性のみを書き込む

ファイル属性は0です

新しい読み取り専用属性

誰かが更新されたフラグを設定する正しい方法を教えてもらえますか?ドキュメントを参照しましたが、まだはっきりしていません。

4

1 に答える 1

0

ファイルの許可を変更するには、chmodまたはfchmodを使用する必要があります。arguファイルのパスを含むchmodとfdを含むfchmod。

fcntlのフラグF_SETFLは、O_APPEND、O_ASYNC、O_DIRECT、O_NOATIME、およびO_NONBLOCKフラグのみを設定できます。

F_SETFL(long)ファイルステータスフラグをargで指定された値に設定します。argのファイルアクセスモード(O_RDONLY、O_WRONLY、O_RDWR)およびファイル作成フラグ(つまり、O_CREAT、O_EXCL、O_NOCTTY、O_TRUNC)は無視されます。Linuxでは、このコマンドはO_APPEND、O_ASYNC、O_DIRECT、O_NOATIME、およびO_NONBLOCKフラグのみを変更できます。

于 2012-11-27T08:19:17.430 に答える