记录一下今天的收获,项目上的一个需求是将嵌入式平台内的所有的打印信息输出到一个统一的地方,方便管理,为了实现这种需求 我一共尝试了几种方案,记录一下。
1 . 需求1 嵌入式设备的串口打印信息转移到另一个控制台这种需求是因为产品的串口默认是不引出的,平时对产品进行调试的时候免不了需要去查看串口信息,那么 我们自然就希望将原本的串口控制台的输出信息转移到当前的通用ssh 登录的控制台。
相关的代码的实现如下:
#include#include #include #include #include #include int main(int argc, char *argv[]) { int tty = -1; char *tty_name = NULL; if(argc < 2) { printf("usge: %s [on/off] n",argv[0]); return 0; } tty_name = ttyname(STDOUT_FILENO); printf("tty_name: %sn", tty_name); if(!strcmp(argv[1], "on")){ tty = open(tty_name, O_RDonLY | O_WRONLY); ioctl(tty, TIOCCONS); perror("ioctl TIOCCONS"); }else if(!strcmp(argv[1], "off")){ tty = open("/dev/console", O_RDonLY | O_WRONLY); ioctl(tty, TIOCCONS); perror("ioctl TIOCCONS"); }else{ printf("usge: %s [on/off] n",argv[0]); return -1; } close(tty); return 0; }
#使用方法 gcc 1.c ./a.out on ./a.out off
此时我们就可以实现使用ssh登录的控制台看到应该打印到串口的输出 比如 内核的打印信息等
2. 需求2 将某一个进程的所有打印信息传递到一个管道这个需求就是需要我们将这个进程的打印信息传递到某一个管道内部 方便其他的进程去获得这个管道的数据,进而方便用户程序去管理和维护后续的这些程序。
#include#include #include #include const char *fifo_name = "/fifo"; int main () { FILE *fp; if (access(fifo_name, F_OK) == -1){ // 管道文件不存在 创建命名管道 int res = mkfifo(fifo_name, 0777); if (res != 0){ fprintf(stderr, "Could not create fifo %sn", fifo_name); return -1; } } fp = freopen(fifo_name, "w+", stdout); // char *buf =(char *)malloc(1 * sizeof(char)); // 注意 这里需要保证被设置成缓冲区的地方不会被释放! // setbuffer(fp,buf,1); int cnt = 0; while(1){ printf("Runing ... %dn",cnt ++); usleep(1000000); } fclose(fp); return 0; }
#使用方法 : # 1 . gcc 1.c ### 编译 # 2 . ./a.out & ### 后台运行 # 3 . cat /fifo ### 查看管道内的内容



