通过网络安装时正确关闭文件描述符

问题描述 投票:1回答:3

我目前正在尝试找出当指向远程文件且连接丢失时如何正确关闭文件描述符。

我有一个简单的示例程序,该程序在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);
    }
}

当连接断开时(即拔出板之间的以太网电缆),无论是否使用标志O_NONBLOCK,主线程中的close始终会阻塞。

写入调用有时会因EBADF错误而立即失败,或者有时会持续很长一段时间才失败。

我的问题是,当连接断开时,写调用不会总是失败,因此我无法将事件触发到线程中,也无法从主线程触发事件,因为close会永远阻塞。 >

所以我的问题是:如何在C中正确处理这种情况?

我目前正在尝试找出当指向远程文件且连接断开时如何正确关闭文件描述符。我有一个简单的示例程序,它打开文件描述符...

c remote-access file-descriptor mount-point
3个回答
2
投票

问题是:如何在C中正确处理这种情况?


1
投票

远程文件系统存在一个基本问题,一方面,您必须缓存内容以使性能保持在可用的水平,另一方面,在多个客户端中进行缓存可能会导致冲突,而远程文件系统看不到这些冲突。服务器。


0
投票

经过一番摸索之后,我发现可以将SSH挂载配置为在没有任何反应的情况下断开连接并断开与服务器的连接。

© www.soinside.com 2019 - 2024. All rights reserved.