Man Linux: Main Page and Category List

NAME

       sockdown - shutdown(2) a socket

       netpipes 4.2

SYNOPSIS

       sockdown [ fd [how] ]

DESCRIPTION

       sockdown  performs  the  shutdown(2)  system  call  on  one of its file
       descriptors specified by fd.  The possible values for how are

       +----------+---------------------------------------------------------+
       |writeonly | convert to write-only file descriptor                   |
       |0         | convert to write-only file descriptor                   |
       |writeonly | symbolic for same as above                              |
       |1         | convert to read-only file descriptor                    |
       |readonly  | symbolic for same as above                              |
       |2         | complete shutdown.  no more reads or writes are allowed |
       |totally   | symbolic for same as above                              |
       +----------+---------------------------------------------------------+

       The default fd is 1 (stdout) and the default how is 1.

EXAMPLES

       Imagine you have a machine that can perform a  service  (in  this  case
       conversion from ASCII to fancy postscript) :

       server$ faucet 3000 --in --out enscript -2rGhp -

       You  may  then  connect  to it with a hose.  However, the first example
       enters deadlock :

       client$ hose server 3000 -in -out \
                 sh -c " cat blah.txt & cat > blah.ps "

       The enscript blocks waiting for input from the socket because  not  all
       of  the  client  processes  have  exited.   While  the  cat blah.txt is
       finished, the cat > blah.ps is not, and will not be finished until  the
       remote  enscript  process  finishes writing.  The enscript process will
       not  finish  writing  until  it   is   finished   reading,   but   that
       client->server  half of the socket is still open and will not be closed
       until all the client processes are done.  The result is deadlock.

       So, we use sockdown to close half of the pipe

       client$ hose server 3000 -in -out \
                 sh -c " ( cat blah.txt ; sockdown ) & cat > blah.ps "

       This way when the cat blah.txt is done, half of the socket is shut down
       and  the remote enscript process runs out of input, causing it to flush
       its output and exit, so eventually the whole mess finishes cleanly.

       Note: the & on the hose is necessary to prevent another  deadlock.   If
       we  simply used the ; to serialize the two cat processes it is possible
       that the enscript would fill up its write buffer before the  first  cat
       was  done causing both processes to block and preventing the second cat
       from draining the pipe.

       Of course, that idiomatic usage of hose is  so  useful  that  it  is  a
       special form:

       client$ hose server 3000 -slave < blah.txt > blah.ps

       Ian  Stirling  <root@mauve.demon.co.uk> informs me that sockdown can be
       used in Linux’s /proc/pid/fd/ directories to  tear  down  hung  network
       connections.   I have since used this myself on a wedged MOMspider.  To
       try this, you have to  know  the  PID  of  the  program  and  the  file
       descriptor  of  the  wedged  socket  (can sometimes be found by running
       strace and see if the program is stuck in a read(2) system  call).   If
       the PID is 991 and the socket’s descriptor is 5, you do this as root:

       bash# sockdown 1 2 > /proc/991/fd/5

ERRORS

       Socket operation on non-socket

       Invalid  argument (seen on Solaris) The fd you specified does not refer
       to a socket.  This happens when you  run  sockdown  by  itself  (it  is
       unlikely  that  any  of the file descriptors attached to an interactive
       shell are actually sockets) or if you goof up your faucet/hose  command
       and forgot to dup(2) one of your descriptors.

       Bad  file  number  You  gave  it a bad file number for fd.  If you have
       enough skill to actually generate this error, you probably know what is
       wrong.

       If you encounter any other errors, clue me in.

SEE ALSO

       netpipes  (1)  faucet  (1),  hose  (1),  getpeername  (1),  socket (2),
       shutdown (2),

NOTES

       Any normal human would assume a program this simple has to be bug free,
       but I am an experienced programmer.

       Just  avoid  doing  anything funky like passing sockdown strings and it
       should serve you well.  You should not have to pass  it  any  arguments
       unless you are doing something fairly funky.

       Perhaps  I  should  ditch  the  shutdown  -a  semantics on hose since a
       sockdown 1 2 would do the job.

CREDITS

       Ian Stirling <root@mauve.demon.co.uk>,  for  the  idea  of  using  this
       program in /proc on a Linux machine.

COPYRIGHT

       Copyright (C) 1995-1998 Robert Forsman

       This program is free software; you can redistribute it and/or modify it
       under the terms of the GNU General Public License as published  by  the
       Free  Software Foundation; either version 2 of the License, or (at your
       option) any later version.

       This program is distributed in the hope that it  will  be  useful,  but
       WITHOUT   ANY   WARRANTY;   without   even   the  implied  warranty  of
       MERCHANTABILITY or FITNESS FOR  A  PARTICULAR  PURPOSE.   See  the  GNU
       General Public License for more details.

       You should have received a copy of the GNU General Public License along
       with this program; if not, write to the Free Software Foundation, Inc.,
       675 Mass Ave, Cambridge, MA 02139, USA.

AUTHOR

       Robert Forsman
        thoth@purplefrog.com
        Purple Frog Software
        http://web.purplefrog.com/~thoth/

                                 July 7, 1998