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;
}

温馨提示:
以上文章描述如有不清晰之处,欢迎在评论区评论,如有时间,会第一时间回复,谢谢!

猜你喜欢

转载自blog.csdn.net/qq_20677327/article/details/104531054