2015-09-19 4 views
0

У меня возникли проблемы с использованием fcntl() и fileno. У меня возникла проблема с внедрением механизма блокировки. Однако, когда я пытаюсь закрыть файл, я получаю следующую ошибку: fcntl: Плохой дескриптор файла. Я использую fileno, чтобы получить описание файла, и я получаю -1.bad file descriptor fileno

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <fcntl.h> 
#include <unistd.h> 

//args ==path to the file 
int main(int argc, char *argv[]) 
{ 
    struct flock lock = {F_WRLCK, SEEK_SET, 0,  0,  0 }; 
    int fd; 
    FILE* fp; 

    lock.l_pid = getpid(); 

    if (argc > 1) 
     lock.l_type = F_RDLCK; 

    printf("%s\n", argv[1]); 

    fp = fopen(argv[1], "w"); 

    if(fp==NULL) 
    { 
     perror("fopen"); 
     exit(1); 
    } 

    fd=fileno(fp); 

    getchar(); 

    if (fcntl(fd, F_SETLKW, &lock) == -1) { 
     perror("fcntl"); 
     exit(1); 
    } 

    lock.l_type = F_UNLCK; 


    if (fcntl(fd, F_SETLK, &lock) == -1) { 
     perror("fcntl"); 
     exit(1); 
    } 

    close(fd); 

    return 0; 
} 
+0

вы должны обращаться ARGC <= 1 –

ответ

2

По fcntl(3):

EBADF: fd не является дескриптором открытого файла, или или команда была F_SETLK или F_SETLKW и открытый режим дескриптора файла не совпадает с запрошенный тип блокировки.

И, случается, что вы не установка l_type члена lock к F_WRLCK, в соответствии с мандатом человека странице выше. Таким образом, просто добавьте эту строку до первого вызова fcntl(), и все будет хорошо.

lock.l_type = F_WRLCK; 
0

из Fcntl ручной страницы, как @KemyLand Указано выше

EBADF FD не является дескриптор открытого файла или команда была F_SETLK или F_SETLKW и дескриптор открытого файла в режиме не соответствует с запросом типа блокировки.

это, вероятно, означает, что проблема здесь

fp = fopen(argv[1], "w"); 

Хотя эта программа, кажется, работает хорошо с ниже вариант, но я нахожу, что это трудно объяснить, почему это, кажется, хорошо работать с ними , что-то общее с логикой открытия.

fp = fopen(argv[1], "a+"); 
fp = fopen(argv[1], "r"); 
fp = fopen(argv[1], "w+"); 
+0

Проблема в том, если из (ARGC> 1) lock.l_type = F_RDLCK; который не работает с «w». Я помещаю блокировку чтения, но пытаюсь написать, которые не работают вместе – atkawa7

Смежные вопросы