2
我的代码看起来在某种程度上是这样的:叉写入文件句柄再次
//INCLUDES
FILE *file;
void handlesocket(int socket);
int main(int argc, char *argv[])
{
openlog("daemon", LOG_PID, LOG_USER);
syslog(LOG_INFO, "daemon started.");
file = fopen("/var/log/daemon.log","a+");
fprintf(file,"Opened log file...");
while (1) {
pid = fork();
if (pid == 0) {
handlesocket(socket);
exit(0);
}
else close(socket);
}
}
void handlesocket(int socket)
{
//handle socket
}
基本上,它正在等待新的连接,然后fork了自己。 (我删除了所有的套接字代码,所以它更容易阅读
我的问题是,每次有新的连接进来(并且新的fork()被调用)时,fprintf
似乎再次被调用,并且有一个新的。"Opened log file..."
在我的日志
为什么会发生这种情况
好的,谢谢!但是在fprintf()完成之后不应该清除缓冲区吗? – Zulakis
有时是的,有时没有。我相信stderr会在每一个换行符后自动刷新。但大多数流不会。 –
(这是一件好事,因为大多数时候你想缓冲,因为它通过减少所需的系统调用次数来提高性能) –