Запись в файл в C оставляет файл открытым - PullRequest
0 голосов
/ 19 февраля 2020

Существует множество примеров добавления текста в файл с использованием C, например , этот пример

Мне нужно изменить исходный код Asterisk , поскольку нам нужно знать, когда происходят определенные события. В исходном коде звездочки у меня есть этот код в нескольких местах:

// Asterisk source code

// Something interesting happens

// My code ...
FILE *pFile;
pFile=fopen("/var/log/asterisk/ublux-channel-events.txt", "a"); // apped to file
if(pFile==NULL) { 
    perror("Error opening file."); 
}
else { 
    fprintf(pFile, "Fire-Event 1!\n");       # fire event 1
}
fclose(pFile);

// Asterisk original source code

Asterisk в конечном итоге падает, потому что его процессы используют несколько файлов. Команда

lsof -a -p 18778 # 18778 - это идентификатор процесса звездочки, запущенной на моем компьютере в данный момент

Когда я запускаю эту команду, я вижу:

asterisk 18778 root 2524w      REG              202,1   468823  424997 /var/log/asterisk/ublux-channel-events.txt
asterisk 18778 root 2525w      REG              202,1   468823  424997 /var/log/asterisk/ublux-channel-events.txt
asterisk 18778 root 2526w      REG              202,1   468823  424997 /var/log/asterisk/ublux-channel-events.txt
asterisk 18778 root 2527w      REG              202,1   468823  424997 /var/log/asterisk/ublux-channel-events.txt
asterisk 18778 root 2528w      REG              202,1   468823  424997 /var/log/asterisk/ublux-channel-events.txt
asterisk 18778 root 2529w      REG              202,1   468823  424997 /var/log/asterisk/ublux-channel-events.txt
asterisk 18778 root 2530w      REG              202,1   468823  424997 /var/log/asterisk/ublux-channel-events.txt
asterisk 18778 root 2531w      REG              202,1   468823  424997 /var/log/asterisk/ublux-channel-events.txt
asterisk 18778 root 2532w      REG              202,1   468823  424997 /var/log/asterisk/ublux-channel-events.txt
asterisk 18778 root 2533w      REG              202,1   468823  424997 /var/log/asterisk/ublux-channel-events.txt
asterisk 18778 root 2534w      REG              202,1   468823  424997 /var/log/asterisk/ublux-channel-events.txt
asterisk 18778 root 2535w      REG              202,1   468823  424997 /var/log/asterisk/ublux-channel-events.txt
asterisk 18778 root 2536w      REG              202,1   468823  424997 /var/log/asterisk/ublux-channel-events.txt
asterisk 18778 root 2537w      REG              202,1   468823  424997 /var/log/asterisk/ublux-channel-events.txt
asterisk 18778 root 2538w      REG              202,1   468823  424997 /var/log/asterisk/ublux-channel-events.txt
asterisk 18778 root 2539w      REG              202,1   468823  424997 /var/log/asterisk/ublux-channel-events.txt
asterisk 18778 root 2540w      REG              202,1   468823  424997 /var/log/asterisk/ublux-channel-events.txt
asterisk 18778 root 2541w      REG              202,1   468823  424997 /var/log/asterisk/ublux-channel-events.txt
asterisk 18778 root 2542w      REG              202,1   468823  424997 /var/log/asterisk/ublux-channel-events.txt
....

Как вы видите, этот файл остается открытым каждый раз, когда вызывается. Как я могу правильно закрыть этот файл с C? Что не так с кодом, который я использую?


Редактировать

Мне кажется, я нашел проблему, с которой столкнулся в других местах, этот код:

FILE *pFile;
                    pFile=fopen("/var/log/asterisk/ublux-peer-subscriptions.txt", "a");
                    if(pFile==NULL) { perror("Error opening file."); }
                    else {
                         fprintf(pFile,"%s|%s|%s|%s|%s\n",
                           /* 1-LN-48T6-E3C5-OFWT */   peer->name,
                           /* 10.0.0.103:5868     */   pvt->initviasentby,
                           /* 189.217.18.244      */   ast_sockaddr_stringify_addr(&peer->addr),
                           /* 10216               */   ast_strdupa(ast_sockaddr_stringify_port(&peer->addr)),
                           /* Z 3.9.32144         */   peer->useragent
                             // Other:
                                // peer->fullcontact, // sip:1-LN-48T6-E3C5-OFWT@189.217.18.244:10216;rinstance=8b4135488f735cbf;transport=UDP
                                // pvt->via      //  SIP/2.0/UDP 54.81.92.135:20001;branch=z9hG4bK58525e18;rport
                             );
                    }
                    fclose(pFile);

возможно peer->fullcontact имеет значение NULL, и он падает, пока не достигнет fclose. Я удалил это, и это прекрасно работает. Извините за вопрос, думая, что это что-то еще.

...