В настоящее время я пытаюсь выяснить, как правильно закрыть дескриптор файла, когда он указывает на удаленный файл и соединение потеряно.
У меня есть простой пример программы, которая открывает дескриптор файла наsshfs смонтируйте папку и начните запись в файл.
Я не могу найти способ обработки случая, когда соединение потеряно.
void *write_thread(void* arg);
int main()
{
pthread_t thread;
int fd = -1;
if(-1 == (fd = open("/mnt/testfile.txt", O_CREAT | O_RDWR | O_NONBLOCK, S_IRWXU)))
{
fprintf(stderr, "Error oppening file : %m\n");
return EXIT_FAILURE;
}
else
{
if(0 > pthread_create(&thread, NULL, write_thread, &fd))
{
fprintf(stderr, "Error launching thread : %m\n");
return EXIT_FAILURE;
}
fprintf(stdout, "Waiting 10 seconds before closing\n");
sleep(10);
if(0 > close(fd))
{
fprintf(stderr, "Error closing file descriptor: %m\n");
}
}
}
void *write_thread(void* arg)
{
int fd = *(int*)arg;
int ret;
while(1)
{
fprintf(stdout, "Write to file\n", fd);
if(0 > ( ret = write(fd, "Test\n", 5)))
{
fprintf(stderr, "Error writing to file : %m\n");
if(errno == EBADF)
{
if(-1 == close(fd))
{
fprintf(stderr, "Close failed : %m\n");
}
return NULL;
}
}
else if(0 == ret)
{
fprintf(stderr, "Nothing happened\n");
}
else
{
fprintf(stderr, "%d bytes written\n", ret);
}
sleep(1);
}
}
Когда соединение потеряно (то есть я отключаю кабель Ethernet между моими платами), close
в главном потоке всегда блокирует, использую ли я флаг O_NONBLOCK или нет.
Иногда вызов записи завершается с ошибкой EBADF или продолжается в течениедолгое время до сбоя.
Моя проблема в том, что вызов write не всегда завершается неудачно, когда соединение теряется, поэтому я не могу вызвать событие в потоке и не могу запустить его из основногонить, потому что close
блокирует навсегда.
Итак, мой вопрос: Как правильно обработать этот случай в C?