Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SIGPIPE, Broken pipe

I am working on a networking program using epoll on linux machine and I got the error message from gdb.

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 ?? ()

My server doing n^2 time calculation and I tried to run the server with 500 connected users. What might cause this error? and how do I fix this?


       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;
        }
like image 599
codereviewanskquestions Avatar asked Jul 26 '11 01:07

codereviewanskquestions


People also ask

What causes SIGPIPE error?

If SIGPIPE is blocked, handled or ignored, the offending call fails with EPIPE instead. Pipes and FIFO special files are discussed in more detail in Pipes and FIFOs. Another cause of SIGPIPE is when you try to output to a socket that isn't connected.

What is a SIGPIPE signal?

A SIGPIPE is sent to a process if it tried to write to a socket that had been shutdown for writing or isn't connected (anymore). To avoid that the program ends in this case, you could either. make the process ignore SIGPIPE. #include <signal.

How do you ignore SIGPIPE?

To ignore the SIGPIPE signal, use the following code: signal(SIGPIPE, SIG_IGN); If you're using the send() call, another option is to use the MSG_NOSIGNAL option, which will turn the SIGPIPE behavior off on a per call basis.

How does Python handle broken pipe exception?

In the above piece of code, we have used the built-in library of python which is the Sys and Errno module, and use the try/catch block in order to catch the raised SIGPIPE exception and handle it before it stops the program execution.


2 Answers

When you write to a pipe that has been closed (by the remote end) , your program will receive this signal. For simple command-line filter programs, this is often an appropriate default action, since the default handler for SIGPIPE will terminate the program.

For a multithreaded program, the correct action is usually to ignore the SIGPIPE signal, so that writing to a closed socket will not terminate the program.

Note that you cannot successfully perform a check before writing, since the remote end may close the socket in between your check and your call to write().

See this question for more information on ignoring SIGPIPE: How to prevent SIGPIPEs (or handle them properly)

like image 176
Greg Hewgill Avatar answered Sep 29 '22 18:09

Greg Hewgill


You're not catching SIGPIPE signals, but you're trying to write to a pipe that's been broken/closed.

Fairly self-explanatory.

It's usually sufficient to handle SIGPIPE signals as a no-op, and handle the error case around your write call in whatever application-specific manner you require... like this.

like image 20
Lightness Races in Orbit Avatar answered Sep 29 '22 18:09

Lightness Races in Orbit