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 ,但经过实际测试,根本没
有个鸟用,所以还是将这段内容屏蔽掉。
最新评论
当把tcsetattr屏蔽了,当然是没问题了,但不知道为什么执行这个函数就有问题,而且如果使用的是不是默认的配置,想改配置,那就必须得执行这个tcsetattr函数。
或者 nohup ./app & 两个都是不同形式的重定向