我必须为学校制作一个简单的应用程序。
我必须在终端上每行写入一个参数,并在标准输出上返回用户选择。
例如,我写cat my_app main.c main.h
,如果用户选择main.c
,那么我返回main.c
到cat。问题是,如果我在标准输出(又名 STDOUT_FILENO)上写入菜单,我会将其返回到cat
.我可以在 STDERR 上写我的菜单,但它有点难看。
我真的不知道如何使用像/dev/tty*
或 这样的设备/文件/dev/pty*
,但我觉得我可以使用它们在终端上写一些东西,而不必在 STDOUT 或 STDERR 上写它。
基本上,我想打开一个新的输出,该输出将由终端显示(STDOUT、STDERR、MYOUT)。
我不知道我解释是否正确。
答案1
要构建一个交互式应用程序,您可以打开/dev/tty
,它会将文件描述符返回到控制终端:
int ttyfd = open("/dev/tty", O_RDWR);
您可以使用它来代替STDIN_FILENO
or STDOUT_FILENO
(当程序启动时,它们可能会被重定向到与终端不同的地方)。
这是一些例子:
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main() {
int ttyfd = open("/dev/tty", O_RDWR);
printf("fd: %d\n", ttyfd);
write(ttyfd, "hello tty!\n", 11);
return 0;
}
当用 调用时./test >out
,它应该在终端上打印 hello 消息以及类似文件fd: 3
中的内容out
。