我有一个使用 buildroot 生成的嵌入式 linux 设置。作为我的应用程序的一部分,我有一个专用线程打开串行端口 (/dev/ttyS0) 用于侦听和回复 modbus 消息。它工作正常,但是当我的目标设备连接到我的主机开发机器时,每当我关闭我的开发机器时,都会通过串行端口发送一些东西,这会杀死我在目标上的进程。在这种情况下,我相信收到 SAK(安全注意密钥)会导致 SAK 内核消息和进程被杀死。我在 unix/linux stackexchange 上发布了这个问题,它的答案部分帮助了我。问题是当我使用禁用串行端口 SAK 时
setserial /dev/ttyS0 ^sak
在系统启动时,当我稍后使用用户空间 API C 代码打开端口时,串行端口再次使用 SAK 选项打开(我已通过禁用 SAK、启动我的应用程序、再次检查setserial
以再次找到 SAK 集来验证这一点)。基本上,我需要知道在配置串行端口时需要在termios
结构中设置哪些标志。tcsetattr()
目前我打开序列号的代码如下:
int current_fd = open(strfile.c_str(), O_RDWR | O_NOCTTY | O_NONBLOCK);
termios new_settings;
tcgetattr(current_fd, &old_options);
tcgetattr(current_fd, &new_settings);
new_settings.c_cflag = 0;
new_settings.c_cflag |= (CLOCAL | CREAD | CS8);
new_settings.c_lflag = 0;
new_settings.c_oflag = 0;
new_settings.c_oflag |= (ONOCR | ONLRET);
new_settings.c_iflag = 0;
new_settings.c_iflag |= (IGNBRK | IGNPAR | IGNCR);
tcsetattr(current_fd, TCSANOW, &new_settings);
我已阅读所有termios
手册页,但看不到任何与 SAK 相关的内容 - 唯一相关的是IGNBRK
我设置的设置。我可以通过用户空间 API 禁用串行端口上的 SAK 设置吗?