Существует множество примеров добавления текста в файл с использованием 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. Я удалил это, и это прекрасно работает. Извините за вопрос, думая, что это что-то еще.