2016-10-28 9 views
0

解決しよう:変更C ==受け入れる(...はCに=受け入れる(...は 一つ==が不適切に使用されたときに警告を表示するには-Wallを使用する必要がありますなぜrsyslogのログ同じログを複数回

私はsyslogの接続口

openlog("program", LOG_PID, LOG_USER); 

Serverコード設定:その後、私はtelnetの

01を使用してconenct

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 localhost 2345 
... 
Connection closed by foreign host. 

ログイン/var/log/user.logは私は一度だけのtelnetと呼ばれることを知っているが、そのrsyslogのは、ランダムな順序でメッセージを複数回、 をログに記録のように見えます

...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が複数回ログに記録された理由を理解できません。

「バグ」を修正する方法を教えてください。

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

cは決して同じ-1

答えて

3

は、ここに1個のバグです。これは値のみ0又は1を有することができるcを使用して、後続のコードにノックオン効果を有するであろう編集

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

であるべきです。

handle_client(c); 

close(c); 
関連する問題