Killian
Killian

Reputation: 157

Closing socket file descriptor after EPIPE

After ignoring SIGPIPE with a call to signal(), there is a possibility that a write() call will fail with errno set equal to EPIPE. Do I still have to close the file descriptor like in the example below?

if (write(sock_fd, buf, len) < 0) {
    if (errno == EPIPE) {
        close(sock_fd);
    }
}

Upvotes: 1

Views: 448

Answers (2)

zwol
zwol

Reputation: 140445

Remember that when you create a pipe, using the system call of the same name, you get two file descriptors: one for reading and one for writing. You get EPIPE from a write operation, on the write fd, when the read fd has been closed. The write fd is still open. If you try to write to it again, you'll get EPIPE again.

(Often, when this happens, the pipe was set up by a shell or some other parent process, and the read fd was never available to your program, but that doesn't matter to the kernel. It was open in some process(es) and now it isn't.)

Since it's still open, you do need to close it. However, exiting automatically closes all fds that are still open. So if the very next thing you'd do after closing the pipe is to exit, then you don't need to bother closing it first. Since it is a pipe, and you already got EPIPE, there can't be any delayed write errors that close might report.

Upvotes: 2

user207421
user207421

Reputation: 310840

You always have to close file descriptors. No ifs, no buts.

Upvotes: 0

Related Questions