fcntl не работает - PullRequest
       27

fcntl не работает

1 голос
/ 23 февраля 2011

У меня есть небольшая программа, которая устает менять режим доступа к файлам после его открытия.


int main(int argc, char* argv[])
{
    int fd;
    char *filename = argv[1];
    char data[1];
    int curval;                         //current flag value
    int newval;                         //new flag value</p>

<pre><code>fd = open(filename, O_RDONLY);

while(read(fd, data, 1)>0)
{
    write(STDOUT_FILENO, data, 1);
}

lseek(fd, 0, SEEK_SET);

if((curval = fcntl(fd, F_GETFL, 0))<0)              
{
    perror("file flag get failed");
}

printf ("% d \ n", curval);newval = curval |O_WRONLY |O_APPEND;printf ("% d \ n", newval);

    if(fcntl(fd, F_SETFL, newval)<0)
{
    perror("file flag set failed");
}

if(write(fd, argv[2], strlen(argv[2]))<0)   //appending more data to the file
{
    perror("write failed");
    }

lseek(fd, 0, SEEK_SET);

while(read(fd, data, 1)>0)
{
    write(STDOUT_FILENO, data, 1);
}
close (fd);
return 0;

}

Вот вывод, когда я запускаю эту программу с текстовым файлом в качестве ввода.

$ cat input
this is the inital data
$ ./a.out input newdata
this is the inital data
0
1025
write failed: Bad file descriptor
this is the inital data

Почему запись в программе не выполняется?Также я не могу найти, где определены константы флага статуса файла.Я проверил в usr / include /

Ответы [ 2 ]

1 голос
/ 23 февраля 2011

Поведение, которое вы пытаетесь выполнить, недопустимо.Со страницы руководства fcntl(2):

   F_SETFL (long)
         Set  the  file status flags to the value specified by arg.  File
         access mode (O_RDONLY, O_WRONLY, O_RDWR) and file creation flags
         (i.e.,  O_CREAT,  O_EXCL, O_NOCTTY, O_TRUNC) in arg are ignored.
         On Linux this command can only  change  the  O_APPEND,  O_ASYNC,
         O_DIRECT, O_NOATIME, and O_NONBLOCK flags.
0 голосов
/ 23 февраля 2011

Если вы прочитаете man-страницу Linux, вы увидите, что fcntl не может изменять режимы доступа к файлам (например, с режима «только чтение» на «чтение и запись»).

...