• mina86@lemmy.wtfOP
      link
      fedilink
      English
      arrow-up
      11
      ·
      3 days ago

      Yes, I agree. But the dispute is what ‘sends EOF’ actually means. The article I respond to claims Ctrl+D doesn’t send EOF but is like Enter except that new line character is not sent. This is, in some sense true, but as I explain also misleading.

      • AndrasKrigare@beehaw.org
        link
        fedilink
        arrow-up
        2
        ·
        2 days ago

        To me, the potential point of confusion is referring to “sent by Ctrl+D” and things “received by the end process” as synonymous, ignoring the tty driver in between. When you Ctrl+d, you send a magic byte value to the tty master (which I would refer to as a EOF character, but I understand the argument against the terminology). On the other side of it the process doesn’t receive this value, but instead has its read call returned even if the buffer is 0.

        A simple example hopefully highlighting the difference

        Window1:
        nc -nvlp 5555 #"far nc"
        
        Window2:
        nc -nv 127.0.0.1 5555 #"local NC"
        Hi there[Enter]
        Hi [Ctrl+D]There[Ctrl+D][Enter]
        
        Window3:
        strace -p [pid of local nc]
        
        Window2:
        [Right arrow][Right arrow][Ctrl+D]
        [Ctrl+D]Uh oh[Enter]
        

        What we see is pretty much as described. From the first line, we see “Hi there\n” on the other side. For the second line, we first see "Hi " appear, then “There” then “\n”.

        From the third line, in the strace we can see the sequences representing the right-arrow key, and we can see the tty driver on the far side takes those sequences and interprets them to render the cursor two characters to the right.

        The fourth line is where it gets more interesting. We send the tty driver the EOF byte, and the tty driver interprets this and gives the current active tty client a 0-byte return to read() and assumes we have no more data to send. But unlike bash, nc doesn’t care about a 0-byte read and is still looking for more data (as we can see in the strace). But if we continue to type and send more data (the “Uh oh”), we can see in the strace that the tty never sends this to the nc. So, to some definition, we’re still sending data to the local nc, but the tty driver isn’t actually relaying it