为什么rsyslog会多次记录同一条日志

Why rsyslog logs the same log multiple times

已解决:将 c == accept(... 更改为 c = accept(... 当 == 使用不当时,应该使用 -Wall 来查看警告。

我配置系统日志连接打开

openlog("program", LOG_PID, LOG_USER);

服务器代码:

for (;;) {
    syslog(LOG_NOTICE, "before accept");
    if ((c == accept(s, (struct sockaddr *)&sa, &b)) == -1) {
        syslog(LOG_ERR, "could not accept on socket");
        exit(1);
    }
    syslog(LOG_NOTICE, "after accept");
    pid = fork();
    if (pid < 0) {
        syslog(LOG_ERR, "could not fork to handle client session");
        exit(1);
    } else if (0 == pid) {
        close(s);
        handle_client(c);
        exit(0);
        syslog(LOG_ERR, "exit after");
    } else
        close(c);
}

然后我使用telnet连接

telnet localhost 2345
...
Connection closed by foreign host.

日志/var/log/user.log显示

...some_info...: client was handled
...some_info...: client was handled
...some_info...: before accept
...some_info...: after accept
...some_info...: before accept
...some_info...: after accept
...some_info...: client was handled

看起来 rsyslog 以随机顺序多次记录消息, 虽然我知道我只调用了一次 telnet。 我很清楚程序是如何执行的,但不明白为什么rsyslog会记录多次。

能否请您建议如何解决 "bug"?

这是一个错误:

if ((c == accept(s, (struct sockaddr *)&sa, &b)) == -1) {

其中 c 永远不会等于 -1。应该是

if ((c = accept(s, (struct sockaddr *)&sa, &b)) == -1) {

编辑

这将对使用 c 的后续代码产生连锁反应,它只能具有值 01.

handle_client(c);

close(c);