Linux Stopped (tty output) 问题

在Linux下便遇到一个问题,让进程使用& 在后台运行时,输入enter,会导致 tty stopped 导致程序不能进行。

因为在该进程有用到串口的读取和发送了,tty串口的读写功能丧失。

后来 将 SIGTTOU 忽略掉,signal(SIGTTOU, SIG_IGN);

结果发现不再提示  tty stopped了 ,但是tty串口功能仍旧不能使用。

tty stopped的根本原因是因为在串口在使用当中用到了终端输出功能,然后再从终端读取数据,如果忽略掉,在实际用用中 ,进入后台后,

终端的输入输出将会受到一定的影响,所以还要检查串口的配置问题。

最后发现在串口的配置如下

{
int fd = -1;
int iRet;
int iFd;
struct termios options; 
struct serial_struct serial; 


/* Start: If need, to modify uart dcb config */
ST_UARTDCB dcb = {
.flowctrl = FC_NONE, //none flow control
.databit = DB_CS8, //databit: 8
.stopbit = SB_1, //stopbit: 1
.parity = PB_NONE, //parity check: none
.baudrate = B_460800 //baudrate: 115200
};

if (460800 == baudrate)
dcb.baudrate = B_460800;

fd = Ql_UART_Open(dev_name, baudrate, O_RDWR |FC_NONE|O_NONBLOCK );
DEBUG(LOG_DEBUG,"%s open(\"%s\", %d) = %d\n", PROCESS_NAME, MAIN_UART_DEV, baudrate, fd);
     


/* if need, to modify uart dcb config */
iRet = Ql_UART_SetDCB(fd, &dcb);
//DEBUG(LOG_DEBUG,"SET DCB ret: %d\n", iRet);
iRet = Ql_UART_GetDCB(fd, &dcb);
DEBUG(LOG_DEBUG,"%s GET DCB ret: %d: baudrate: %d, flowctrl: %d, databit: %d, stopbit: %d, paritybit: %d\n", 
PROCESS_NAME, iRet, dcb.baudrate, dcb.flowctrl, dcb.databit, dcb.stopbit, dcb.parity);
#if 0
Ql_UART_IoCtl(fd, TIOCGSERIAL, &serial); 
serial.xmit_fifo_size = FIFO_SIZE; // what is "xmit" ?? 
Ql_UART_IoCtl(fd, TIOCSSERIAL, &serial); 

   tcgetattr(iFd, &options);
    /*
     * 'DATA_LEN' bytes can be read by serial
     */
    options.c_cc[VMIN]   =   4096;                                      
    options.c_cc[VTIME]  =   10;

tcflush(fd, TCIFLUSH);
    if (tcsetattr(iFd,   TCSANOW,   &options)<0) 
        return   -1;
#endif


return fd;
}

将黄色的内容屏蔽掉后测试恢复正常,黄色的内容是我本来要加大串口的发送和接收的buf缓存以增大每次接收和发送的字节buff ,但经过实际测试,根本没

有个鸟用,所以还是将这段内容屏蔽掉。


最新评论

  1. five
    发布于:2018-12-11 09:22 回复
    楼主你好,我也遇到一样的问题,使用GDB调试,发现是在执行tcsetattr这个函数后才出现stopped tty output,但不知道原因,具体根因你清楚吗?
    1. 李德
      发布于:2018-12-13 11:04 回复
      @five:tcsetattr  这个函数读取属性了 不行屏蔽掉呢
      1. five
        发布于:2018-12-14 16:30 回复
        @李德:没太明白你的意思,tcsetattr这个函数是设置属性的,而且我在设置之前先执行tcgetattr这个函数获取当前的属性。在测试的时候,我把当前属性重新设置一遍,还是出现stopped tty output。
        当把tcsetattr屏蔽了,当然是没问题了,但不知道为什么执行这个函数就有问题,而且如果使用的是不是默认的配置,想改配置,那就必须得执行这个tcsetattr函数。
        1. 发布于:2018-12-17 15:23 回复
          @five:如果非要使用的话我知道的就是需要加重定向了  < /dev/log.txt
          或者 nohup   ./app &   两个都是不同形式的重定向
          1. five
            发布于:2018-12-19 09:03 回复
            @小v:这两种方式我都尝试过了,不起效果,不过还是谢谢了

sitemap