Por que a leitura de duas ptys conectadas causa um loop infinito?

6

Eu quero falsificar um modem gsm para testar um programa. Eu quero que o programa envie códigos AT para mim e que eu possa responder de volta, como uma VirtualSerialPort . Mas, por alguma razão, os dados escritos do programa são gravados diretamente para ele.

Eu esperaria que o socat criasse dois canais; um que envia a saída do programa de teste para qualquer coisa que eu tenha anexado no outro lado e outro tubo que funciona na outra direção. Mas os dados parecem "loop em um tubo", se você entender o que quero dizer. Aqui está uma foto do TTY desmistificada para ilustrar meu ponto:

Umscriptdereproduçãosimplificado:

Eucrioosarquivoscom:

(xterm1)$socat-d-d-dPTY,link=fooPTY,link=bar2012/01/1814:45:01startingloopwithFDs[3,3]and[5,5]

Eeuescutoosdoislados:

(xterm2)$cat<bar(xterm3)$cat<foo

Seeuescreveralgunscaracteres...

(xterm4)$echo"..." > foo

.. socat registra um lote de tráfego que vai e volta infinitamente.

(xterm 1)
2012/01/18 14:25:58 socat[7667] I transferred 4095 bytes from 5 to 3
2012/01/18 14:25:58 socat[7667] I transferred 4095 bytes from 3 to 5
2012/01/18 14:25:58 socat[7667] I transferred 4095 bytes from 5 to 3
2012/01/18 14:25:58 socat[7667] I transferred 4095 bytes from 3 to 5
2012/01/18 14:25:58 socat[7667] I transferred 4095 bytes from 5 to 3
2012/01/18 14:25:58 socat[7667] I transferred 4095 bytes from 5 to 3

Não há nada produzido em nenhum dos comandos do cat.

EDIT: @wnoise explicou que o socat cria dois mestres de PTY. Aqui está uma imagem para ilustrar isso:

    
por Daniel Näslund 18.01.2012 / 14:53

1 resposta

3

A sintaxe usada cria dois mestres pty e os conecta bidirecionalmente. Você está recebendo ecos constantes porque não adicionou " echo=0 " às opções. Provavelmente também é necessário adicionar raw ao seu caso de uso.

    
por 18.01.2012 / 21:36