Linux基础入门--串口重定向
1.现象
有些进程出现使用printf 无法打印信息到串口
2.分析
2.1 没有刷新缓冲区
默认Linux 设置了打印缓冲功能,当打印缓冲区未满情况下,不打印。如果需要打印,增加fflush(stdout) 语句或者以\n结尾,用于刷新缓冲区,即可打印。
2.2 关闭了标准输入输出功能
在系统或者进程中,关闭了printf功能,将输入输出重定向到 /dev/null 中,所以printf的输出,都输出到/dev/null,自然无法打印信息。通过以下命令查看:
# ls -al /proc/PID/fd
dr-x------ 2 root root 0 Apr 28 11:36 .
dr-xr-xr-x 7 root root 0 Apr 28 11:00 ..
lrwx------ 1 root root 64 Apr 28 11:36 0 -> /dev/null
lrwx------ 1 root root 64 Apr 28 11:36 1 -> /dev/null
lrwx------ 1 root root 64 Apr 28 11:36 2 -> /dev/null
从中可以看到 0、1、2 文件都被指向 “dev/null”
shell 中运行的进程,默认会有3个文件描述符存在(0、1、2)
0–与进程的标准输入相关联。
1–与进程的标准输出相关联。
2–与进程的标准错误输出相关联。
0、1、2都被指向 /dev/null,所以 输入、输出、标准错误的信息都指向null,往null 丢数据,自然什么都没有显示。
3.解决方案
重定向输入、输出、错误信息。本设备的输出串口为 /dev/console,则进行设置的代码实现重定向:
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
void set_redirect()
{
int fd = -1;
fd = open("/dev/console", O_RDWR);
if (fd < 0)
{
fprintf(stderr, "errno=%d (%s)\n", errno, strerror(errno));
return;
}
dup2(fd, 0); // standrad input set
dup2(fd, 1); // standrad ouput set
dup2(fd, 2); // standrad error set
close(fd);
}
int main(int argc, char** argv)
{
set_redirect();
return 0;
}
温馨提示:
以上文章描述如有不清晰之处,欢迎在评论区评论,如有时间,会第一时间回复,谢谢!