Почему открытый дескриптор не закрывается при выходе из программы? - PullRequest
1 голос
/ 20 сентября 2011

У меня есть небольшая программа ниже на 2.6.16-rc3, которая использует ящик занятости (в файловой системе jffs2). Если я запускаю программу несколько раз, она начинает проваливаться второй раз. Когда программа завершает работу, дескрипторы должны автоматически закрываться и в следующий раз запускаться заново, верно?

Почему я иногда получаю -1? (Примечание. На моем ПК с Fedora Linux все работает нормально)

root@badge 07:29:32 ~ >touch Hello.txt
root@badge 07:29:37 ~ >./a.out
FP = 3
root@badge 07:29:38 ~ >./a.out
FP = -1
root@badge 07:29:40 ~ >./a.out
FP = 3
root@badge 07:29:41 ~ >./a.out
FP = -1
root@badge 07:29:42 ~ >./a.out
FP = 3
root@badge 07:29:43 ~ >./a.out
FP = 3
root@badge 07:29:43 ~ >./a.out
FP = -1
root@badge 07:29:45 ~ >

Программа:

#include <stdio.h>
int main()
{
        int fp;
        fp = open ("Hello.txt");
        printf("FP = %d\n", fp);
        return 0;  // No close() is used. On exit, it shall be closed.
}

Текстовый файл:

    -rw-r--r--    1 root     root            0 Sep 20 07:22 Hello.txt

1 Ответ

8 голосов
/ 20 сентября 2011

Вы не следуете контракту open(). Страница руководства (в Linux) гласит:

SYNOPSIS
       #include <sys/types.h>
       #include <sys/stat.h>
       #include <fcntl.h>

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

       int creat(const char *pathname, mode_t mode);

Как вы можете видеть, вы забыли включить правильные заголовки, а open() также принимает параметр flags, в котором вы указали бы права на чтение / запись и т. Д. Как это изложено, вы получите загадочный аргумент передается open(), это то, что было в стеке или в регистрах в то время.

...