SIGPIPE, Rohrbruch

Lesezeit: 3 Minuten

Benutzer-Avatar
codereviewFragen stellen

Ich arbeite an einem Netzwerkprogramm, das epoll auf einem Linux-Rechner verwendet, und ich habe die Fehlermeldung von gdb erhalten.

Program received signal SIGPIPE, Broken pipe.
[Switching to Thread 0x7ffff609a700 (LWP 19788)]
0x00007ffff7bcdb2d in write () from /lib/libpthread.so.0
(gdb)
(gdb) backtrace
#0  0x00007ffff7bcdb2d in write () from /lib/libpthread.so.0
#1  0x0000000000416bc8 in WorkHandler::workLoop() ()
#2  0x0000000000416920 in WorkHandler::runWorkThread(void*) ()
#3  0x00007ffff7bc6971 in start_thread () from /lib/libpthread.so.0
#4  0x00007ffff718392d in clone () from /lib/libc.so.6
#5  0x0000000000000000 in ?? ()

Mein Server führt n^2 Zeitberechnungen durch und ich habe versucht, den Server mit 500 verbundenen Benutzern auszuführen. Was könnte diesen Fehler verursachen? und wie behebe ich das?


       while(1){
            if(remainLength >= MAX_LENGTH)
                currentSentLength = write(client->getFd(), sBuffer, MAX_LENGTH);
            else
                currentSentLength = write(client->getFd(), sBuffer, remainLength);


            if(currentSentLength == -1){
                log("WorkHandler::workLoop, connection has been lost \n");
                break;
            }
            sBuffer += currentSentLength;
            remainLength -= currentSentLength;

            if(remainLength == 0)
                break;
        }

  • SIGPIPE tritt auf, wenn Sie versuchen, in eine geschlossene Pipe zu schreiben. Stellen Sie sicher, dass die Pipe, in die Sie schreiben, nicht geschlossen ist.

    – Jesus Ramos

    26. Juli 2011 um 1:21 Uhr

  • Poste das als Antwort, damit wir es positiv bewerten können. Es ist so viel Antwort wie möglich, wenn man bedenkt, wie wenig Informationen in der Frage enthalten sind. @LCYSoft: Der GDB-Trace ist ohne den Code für die aufgerufenen Funktionen nutzlos.

    – Mike DeSimone

    26. Juli 2011 um 1:25 Uhr

  • Nr. Post a Testfall. Wir werden jetzt Hunderte von nutzlosen Zeilen bekommen.

    – Leichtigkeitsrennen im Orbit

    26. Juli 2011 um 1:25 Uhr

Benutzer-Avatar
Greg Hewgill

Wenn Sie in eine (vom entfernten Ende) geschlossene Pipe schreiben, erhält Ihr Programm dieses Signal. Für einfache Befehlszeilenfilterprogramme ist dies oft eine geeignete Standardaktion, da der Standardhandler für SIGPIPE das Programm beendet.

Bei einem Multithread-Programm ist die richtige Aktion normalerweise to ignorieren das Signal SIGPIPE, so dass das Schreiben in einen geschlossenen Socket das Programm nicht beendet.

Beachten Sie, dass Sie kann nicht Führen Sie vor dem Schreiben erfolgreich eine Überprüfung durch, da das entfernte Ende den Socket zwischen Ihrer Überprüfung und Ihrem Aufruf schließen kann write().

Weitere Informationen zum Ignorieren von SIGPIPE finden Sie in dieser Frage: Wie man SIGPIPEs verhindert (oder richtig damit umgeht)

  • Manchmal erhalten Sie ein SIGPIPE, weil die Gegenstelle die Verbindung geschlossen hat und dir nie gesagt. Systemabstürze verursachen dies häufig, da sie offene Sockets nicht bereinigen, sodass Sie nicht wissen, dass der Socket weg ist, bis Sie etwas darauf schreiben und das entfernte Ende behauptet, keine Kenntnis von der Verbindung zu haben.

    – Mike DeSimone

    26. Juli 2011 um 1:28 Uhr

  • Sie können die Überprüfung erfolgreich durchführen; du kannst einfach nicht nützlich tun Sie dies. 🙂

    – Leichtigkeitsrennen im Orbit

    26. Juli 2011 um 1:30 Uhr

  • @Tomalak Geret’kal nein kannst du nicht. Es gibt keine Sockets-API, die Ihnen etwas anderes mitteilt, als eine E/A-Operation zu versuchen.

    – Benutzer207421

    26. Juli 2011 um 8:03 Uhr

  • @EJP: Bah, das mag stimmen. Zumindest ist der Grund, den Sie im dritten Absatz Ihrer Antwort angegeben haben, kein triftiger Grund. 🙂

    – Leichtigkeitsrennen im Orbit

    26. Juli 2011 um 13:22 Uhr


  • @Tomalak Geret’kal es ist WAHR. Kein ‘kann’ dabei sein. Ich nehme an, Sie beziehen sich auf den dritten Absatz in Greg Hewgills Antworten?

    – Benutzer207421

    27. Juli 2011 um 6:42 Uhr

Benutzer-Avatar
Leichtigkeitsrennen im Orbit

Du fängst nicht SIGPIPE Signale, aber Sie versuchen, in eine defekte/geschlossene Pipe zu schreiben.

Ziemlich selbsterklärend.

In der Regel reicht die Handhabung aus SIGPIPE Signale als No-Op, und behandeln Sie den Fehlerfall um Sie herum write Rufen Sie in jeder anwendungsspezifischen Weise auf, die Sie benötigen … so.

1175350cookie-checkSIGPIPE, Rohrbruch

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy