2017-02-01 1 views
3

Я написал эту программу, чтобы открыть файл. Все было нормально, пока я не видел это разрешение (-ws-WX - T) с ls -lhнеожиданный результат (-wS-wx-T) по разрешению файла с помощью функции open() в C

open.c

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

#define FILE "foo.txt" 

int main() 
{ 
     int fd; 
     int errnum; 

     fd = open(FILE, O_RDWR | O_CREAT); 

     if(fd == -1) 
     { 
       printf("[error] The file hasn't opened.\n"); 
       perror("Error printed by perror"); 
     }else { 
       printf("The process was succeeded\n"); 
     } 

     return 0; 
} 

Я составил программу featly, не принимать какие-либо ошибки или предупреждения.

$ ./open 
The process was succeeded 
$ ls -lh 
-rwxrwxr-x 1 hemre hemre 8.5K Feb 1 23:38 open 
--wS-wx--T 1 hemre hemre 0 Feb 1 23:39 foo.txt 

Я никогда не видел разрешения. Что такое «S» и «T», что означает в разделе раздел «Права доступа к файлам»? (ПРИМЕЧАНИЕ: Я принял ответ на этот вопрос в комментариях.)

+1

Если вы ищете объяснения по разрешениям файловой системы Linux, лучше просмотреть [unix.stackexchange.com] (http://unix.stackexchange.com). – AntonH

+0

@ Это разрешение появилось после программы C. Я думаю, что это тоже связано. – metarose

+0

@jxh umask is 0002. – metarose

ответ

8

Если включить O_CREAT в тростнике, переданных open() то необходимо использовать три-Arg вид функции, которая принимает числовой файл в качестве третьего аргумента. Это требование описано в the Linux manual page for the function (курсив добавлен):

mode аргумент определяет биты режима файла применяется при создании новый файл. Этот аргумент должен быть поставлен, если O_CREAT или O_TMPFILE указан в flags; если ни O_CREAT, ни O_TMPFILE не указаны , тогда режим игнорируется.

Какой режим вы на самом деле хотите, неясно, но, возможно, S_IRUSR | S_IWUSR | S_IRGRP будет подходящим (== 0640, читать и писать для владельца, только чтение для группы владельца, нет разрешения на кого-либо еще).

+0

Что это значит S и T? – metarose

+1

@ H.Emre, 'S' в выводе 'ls' представляет бит SUID файла. «Т» представляет собой липкий бит. –

0

Я нашел два разных определения функции open, вы можете увидеть их с помощью man 2 open и man 3 open в терминале linux.

man 2 open для Linux Программист Мануэль.
man 3 open для POSIX Программист Мануэль.

Если вы используете Manuel определение POSIX программиста (образец кода в вопросе) для открытой функции, вы можете принимать неожиданные разрешения (например, -ws-WX - T).
Если вы используете Определитель Manuel Linux (пример кода ниже), вы можете получить регулярное разрешение.
Я не уверен, что это правда, но я это заметил.
Если я ошибаюсь, пожалуйста, поправьте меня.

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

    int main(int argc, char *argv[]) 
    { 

      int fd; 

      if(argc != 2){ 
        printf("[usage] %s <file_name>\n", argv[0]); 
        exit(0); 
      } 

      fd = open(argv[1], O_RDWR | O_APPEND | O_CREAT, S_IRWXU | S_IRWXG | S_IROTH); 
     if(fd == -1){ 
       perror("[error] open function\n"); 
       exit(-1); 
     }else{ 
       printf("[succeeded]\n"); 
     } 

     return 0; 
}