文件打开关闭配对问题

VideoDecoder打开文件

FILE *fp;
fp = fopen(path, "rb");

void VideoDecoder::release() {
    if (fp) {
        fclose(fp);
    }
}

MediaSource打开文件

FILE *file;
file = fopen(file_str, mode);

同一个线程有两个对象分别打开两个文件,第一个对象VideoDecoder打开fd是94, 用完后通过release函数调用fclose关闭, 但是这个释放完成后没有对fp没有赋值为NULL.

这时候对象二MediaSource同样的方式打开文件, 分配的fd也刚好是94, 对象二需要进行seek, read等操作时候, VideoDecoder的release又被调用一次, 这时候悲剧发生了, VideoDecoder中的fp虽然被close了,但是还是通过release里面close把fd为94的文件给关闭了, 这个fd是ediaSource里面刚刚打开的, 所以就seek, read操作都失败, 用fileno(file)得到的MediaSource中的fd也变成了-1.

所以最后解决办法就超简单, fp赋值为NULL即可.

void VideoDecoder::release() {
    if (fp) {
        fclose(fp);
        fp = NULL;
    }
}

文件打开关闭必须配对, 这个问题中, 同一线程打开了两个文件,前一个被释放的时候,后一个打开的fd刚好用了前一个fd.

你可能感兴趣的:(文件打开关闭配对问题)