Antworten

Die relevanten Systemaufrufe:

theon$ truss 2>truss.out tcpserver 0 22048 date & echo $! >truss.pid
[1] 26452
theon$ sleep 1
[1]+  Exit 2                  truss tcpserver 0 22048 date 2> truss.out
theon$ kill -HUP $(cat truss.pid) && rm -f truss.pid
bash: kill: (26452) - No such process
theon$ kill $(ps | grep tcpserv | grep -v grep | awk '{ print $1 }')
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
theon$ sed -n '/socket(PF_INET/,$p' truss.out && rm -f truss.out
theon$ 

Wie hieran zu erkennen ist, wartet tcpserver in accept. Der erste Parameter ist ein Dateideskriptor, der zuvor mit einem socket-Systemaufruf („sosocket“ in der Ausgabe von truss) erzeugt wurde und anschließend u.a. mit setsockopt, bind und listen_ vorbereitet wurde.

Der kleine Netzwerkdienst:

theon$ tcpserver 0 22049 /bin/sh -c 'echo $TCPREMOTEIP' & echo $! >service.pid
[1] 26464
theon$ 
heim$ telnet theon 22049
telnet: Unable to connect to remote host: Connection refused
Trying 134.60.66.7...
heim$ 
theon$ kill $(cat service.pid) && rm -f service.pid
bash: kill: (26464) - No such process
theon$