有关终端驱动程序和Unix及相关系统终端行为的问题。
如果我使用 Python boto3 库在 AWS ECS 容器上使用execute_command 运行命令(如此处所示),我的命令只是 echo -ne ' ' (单个明确的换行符),...
在Linux内核中,将字符打印到文本VGA控制台的函数在哪里?
我正在阅读Linux的源代码,希望能够更好地理解它的架构。我的目标是将其减少到最小的“hello,world”二进制文件,删除尽可能多的不相关代码
在带有 Arch Linux 的 Raspberry Pi 上,有一个名为serial-getty@AMA0 的服务处于活动状态。 单元文件为:/usr/lib/systemd/system/[email protected] 作为 root 我可以调用 systemctl stop Serial-getty@
我已经使用 Raspberry Pi Pico 一段时间了,我正在使用 minicom 进行串行通信。但有一天,当连接到 USB 端口时,Pico 停止生成 tty/ATCM0。在这一切之前...
当我将设备插入 USB 端口时,命令 dmesg 会产生此输出 > dmesg -wH [+9.913990] USB 3-1.2:使用 xhci_hcd 的新高速 USB 设备编号 8 [+0.091634] USB 3-1.2:新USB ...
在大型 monorepo(.git 目录 10GB)中,我观察到以下行为。 # 输出到文件时,速度非常快: 时间 git log -2 > /tmp/X 实际0m0.076s 用户0m0.007s 西...
是否有可能欺骗进程认为它没有附加到 C 或 bash 中的 tty?
至少有一个问题是如何欺骗一个进程,使其认为它已连接到 TTY,而实际上它并未连接到 TTY。 我有兴趣做相反的事情。 假设我调用的命令是...
我在应用程序中使用curses python 库,并且还实现了一个文本框https://docs.python.org/3/library/curses.html#textbox-objects。 有没有办法在
Linux TTY 驱动程序等待接收 1024 字节,我需要无缓冲 [已关闭]
我正在寻找一个命令来监视串行终端端口,以十六进制转储未缓冲的数据。数据不是面向行的。 我试过: socat -b 1 -v -x /dev/ttymxc2,cfmakeraw - | socat -b 1 -v -x /dev/ttymxc2,cfmakeraw - |猫 >/dev/nul...
为什么当这个 ttyUSB 通过 C 寻址时,有时会向 stdout 写入一些内容,有时则不会?
嗨,我为 ttyUSB 设备用 c 语言编写了以下代码。部分代码来自其他来源: // C 库头文件 #包括 #包括 #包括 嗨,我为 ttyUSB 设备用 c 语言编写了以下代码。代码的某些部分来自其他来源: // C library headers #include <stdio.h> #include <string.h> #include <stdlib.h> // Linux headers #include <fcntl.h> // Contains file controls like O_RDWR #include <errno.h> // Error integer and strerror() function #include <termios.h> // Contains POSIX terminal control definitions #include <unistd.h> // write(), read(), close() // Custom headers //// klammern ////#include "some_functions.h" ////int write_log(char*); int main(int argc, char* argv[]) { if (argc < 2) { printf("Usage: %s <at-command>\n", argv[0]); exit(-1); } int serial_port = open("/dev/ttyUSB4", O_RDWR); // Check for errors if (serial_port < 0) { printf("Error %i from open: %s\n", errno, strerror(errno)); exit(1); } struct termios tty; // Read in existing settings, and handle any error if(tcgetattr(serial_port, &tty) != 0) { printf("Error %i from tcgetattr: %s\n", errno, strerror(errno)); return 1; } tty.c_cflag &= ~PARENB; // Clear parity bit, disabling parity (most common) tty.c_cflag &= ~CSTOPB; // Clear stop field, only one stop bit used in communication (most common) tty.c_cflag &= ~CSIZE; // Clear all bits that set the data size tty.c_cflag |= CS8; // 8 bits per byte (most common) tty.c_cflag &= ~CRTSCTS; // Disable RTS/CTS hardware flow control (most common) tty.c_cflag |= CREAD | CLOCAL; // Turn on READ & ignore ctrl lines (CLOCAL = 1) tty.c_lflag &= ~ICANON; tty.c_lflag &= ~ECHO; // Disable echo tty.c_lflag &= ~ECHOE; // Disable erasure tty.c_lflag &= ~ECHONL; // Disable new-line echo tty.c_lflag &= ~ISIG; // Disable interpretation of INTR, QUIT and SUSP tty.c_iflag &= ~(IXON | IXOFF | IXANY); // Turn off s/w flow ctrl tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL); // Disable any special handling of received bytes tty.c_oflag &= ~OPOST; // Prevent special interpretation of output bytes (e.g. newline chars) tty.c_oflag &= ~ONLCR; // Prevent conversion of newline to carriage return/line feed // tty.c_oflag &= ~OXTABS; // Prevent conversion of tabs to spaces (NOT PRESENT ON LINUX) // tty.c_oflag &= ~ONOEOT; // Prevent removal of C-d chars (0x004) in output (NOT PRESENT ON LINUX) tty.c_cc[VTIME] = 50; // Wait for up to 1s (10 deciseconds), returning as soon as any data is received.; 5 sek ^= 50 tty.c_cc[VMIN] = 0; // Set in/out baud rate to be 9600 cfsetispeed(&tty, B9600); cfsetospeed(&tty, B9600); // Save tty settings, also checking for error if (tcsetattr(serial_port, TCSANOW, &tty) != 0) { printf("Error %i from tcsetattr: %s\n", errno, strerror(errno)); return 1; } // Write to serial port //unsigned char msg[] = { 'a', 't', '+', 'c', 'g', 'p', 'a', 'd', 'd', 'r', '=', '1', '\r' }; unsigned int argv1_len = strlen(argv[1]); char msg[argv1_len+2]; // unsigned char strcpy(msg, argv[1]); ////write_log(msg); strcat(msg, "\r"); write(serial_port, msg, sizeof(msg)); // Allocate memory for read buffer, set size according to your needs char read_buf [256]; // Normally you wouldn't do this memset() call, but since we will just receive // ASCII data for this example, we'll set everything to 0 so we can // call printf() easily. memset(&read_buf, '\0', sizeof(read_buf)); // Read bytes. The behaviour of read() (e.g. does it block?, // how long does it block for?) depends on the configuration // settings above, specifically VMIN and VTIME int num_bytes = read(serial_port, &read_buf, sizeof(read_buf)); // n is the number of bytes read. n may be 0 if no bytes were received, and can also be -1 to signal an error. if (num_bytes < 0) { printf("Error reading: %s", strerror(errno)); close(serial_port); return 1; }else if (num_bytes == 0) { printf("0"); close(serial_port); return 1; } // Here we assume we received ASCII data, but you might be sending raw bytes (in that case, don't try and // print it to the screen like this!) //printf("Read %i bytes. Received message: %s", num_bytes, read_buf); printf("%s", read_buf); fflush(stdout); ////removeLeadingNewlines(read_buf); ////write_log(read_buf); close(serial_port); return 0; // success } 这是我的 Makefile,它的构建没有错误或警告: WARNFLAGS = -W -Wall -Werror OPTFLAGS = -O3 DEBUGFLAGS = -ggdb3 -DDEBUG CFLAGS += $(WARNFLAGS) binaries = at_commander ifdef DEBUG CFLAGS += $(DEBUGFLAGS) else CFLAGS += $(OPTFLAGS) endif all: $(binaries) at_commander: some_functions.c clean: $(RM) *~ $(binaries) *.o 问题是为什么现在不规则地输出到控制台: root@OpenMPTCProuter:~/autostart# ./at_commander at root@OpenMPTCProuter:~/autostart# ./at_commander at root@OpenMPTCProuter:~/autostart# ./at_commander at root@OpenMPTCProuter:~/autostart# ./at_commander at OK root@OpenMPTCProuter:~/autostart# ./at_commander at root@OpenMPTCProuter:~/autostart# ./at_commander at root@OpenMPTCProuter:~/autostart# ./at_commander at OK root@OpenMPTCProuter:~/autostart# ./at_commander at OK root@OpenMPTCProuter:~/autostart# ./at_commander at root@OpenMPTCProuter:~/autostart# ./at_commander at root@OpenMPTCProuter:~/autostart# ./at_commander at OK root@OpenMPTCProuter:~/autostart# 首先我认为这与刷新有关,但也许与我的代码中的错误时机有关。 提前谢谢您! 为什么当这个ttyUSB通过C寻址时,... 您的标题和问题表明您要么对自己正在做的事情了解不够,并且/或者写得不好。 “ttyUSB 设备”不是端点设备(例如闪存驱动器),而是通信接口。假设您使用电缆将某些设备连接到此“ttyUSB 设备”,并且您的目的是与该连接的设备进行通信。然而,您完全忽略了提及任何其他设备的任何信息。 ...有时某些内容会写入标准输出,有时则不会? 您对名词“something”的使用是不明确的,并且完全忽视了以下事实:这涉及(a)命令消息由您的程序传输,(b)该消息必须由远程单元接收和处理,( c) 响应消息必须由该远程单元传输,并且 (d) 该响应消息必须由您的程序接收/读取。 换句话说,“something”是来自远程单元/设备的响应,而(您的程序)失败为“sometimes not”表示该远程单元/设备没有响应。 所连接设备的间歇性响应可能表明向该设备发送了不正确的消息。最坏的情况是连接不良/不良(即电缆/硬件问题)。 您的帖子中只有一些线索可以识别您的程序尝试与之通信的连接设备。一种是注释掉的初始化。有对“at-command”的引用。显然,连接的设备是使用 AT(又名 Hayes)命令集的调制解调器。 您发布的程序有各种小问题,其中大部分已在评论中提到。 IMO 程序中的显着错误是发送消息/命令时不正确的行终止。 AT命令的格式为: 命令以AT开头,大小写均可; 命令以回车符和换行符结束。 但是,您的程序(如发布的那样)以换行符和空字符终止消息。调制解调器可能会感到困惑,因为它没有接收到关键的回车符。因此,偶尔会有OK的回应。
socat -v 等待接收到 1024 字节,我需要无缓冲显示
我正在寻找一个命令来监视串行终端端口,以十六进制转储未缓冲的数据。数据不是面向行的。 我试过: socat -b 1 -v -x /dev/ttymxc2,cfmakeraw - | socat -b 1 -v -x /dev/ttymxc2,cfmakeraw - |猫 >/dev/nul...
socat -v 等待收到 1024 个字节,我需要无缓冲的输出
我正在寻找一个命令来监视 tty 端口,以十六进制转储未缓冲的数据。数据不是面向行的。 我试过: socat -b 1 -v -x /dev/ttymxc2,cfmakeraw - | socat -b 1 -v -x /dev/ttymxc2,cfmakeraw - |猫 >/dev/null 我预计...
考虑以下 C 程序,名为 odd.c (因为它所做的事情没有意义): #包括 #包括 #包括 #包括 考虑下面的 C 程序,名为 weird.c(因为它所做的事情没有意义): #include <inttypes.h> #include <stdint.h> #include <stdio.h> #include <unistd.h> int main(void) { off_t result = lseek(STDOUT_FILENO, (off_t)INT64_MAX, SEEK_SET); if (result != (off_t)-1) printf("Seek successful to position %" PRId64 "\n", (int64_t)INT64_MAX); else perror("lseek failed"); return 0; } 从终端窗口编译并运行它,例如gcc -o weird weird.c && ./weird。从 tty(终端窗口、SSH 会话等)运行它非常重要,因此 stdout 是一个 tty。 在 Linux 上,它将失败并出现错误 lseek failed: Illegal seek – 这是有道理的,在 tty 上查找没有多大意义。 但是,在 macOS 上,它的行为有所不同 - 程序退出而不打印任何内容,然后 shell 也退出。我只能假设这是因为 tty 已进入某种非法状态。但这里到底发生了什么? 顺便说一句,我猜测 macOS 的行为与 FreeBSD 类似。但是 FreeBSD 14.1-RELEASE (amd64) 再次有不同的行为 – 它打印: Seek successful to position 9223372036854775807 这比 macOS 的做法更容易理解(例如,将无意义的操作视为无操作,而不是像 Linux 那样出错。) 黑客新闻上的用户jepler指出了解释。 注意vn_write函数中的这段代码bsd/vfs/vfs_vnops.c: if (write_offset == INT64_MAX) { /* writes are not possible */ error = EFBIG; goto error_out; } 基本上发生的事情是这样的: 在 macOS 中,与 Linux 不同,您可以使用 lseek 设置终端的偏移量 - 即使偏移量实际上没有执行任何操作 但是,一旦偏移量达到 INT64_MAX,进一步的写入尝试就会失败并出现 EFBIG,除非您返回到更早的某个位置。 shell 退出的原因是大多数 shell 在无法写入 stdout/stderr 时退出。 如果您修改我的测试程序以寻求例如INT64_MAX-100,在所有输出开始失败之前,您将能够打印 100 个字节的输出。 此代码似乎已在 xnu-7195.50.7.100.1 (macOS 11 Big Sur) 中引入 - 它在 xnu-6153.11.26 (macOS 10.15 Catalina) 中不存在。 FreeBSD 似乎还允许您在终端中 lseek 到任意偏移量 - 但与 macOS 11+ 不同,如果您查找到 INT64_MAX,则不会拒绝进一步写入。
未捕获错误错误:ENXIO:没有这样的设备或地址,打开'/dev/tty'
如何解决“Uncaught Error Error: ENXIO: no such device or address, open '/dev/tty'”的问题? 我在 Visual Studio Code 中运行以下代码,但它返回有关 /dev/tt 的错误...
当 stdout / stderr 重定向时,是否有标准的 Java 方法来读取/写入 tty?
许多 Unix 程序(例如 mysql 和 Expect)能够绕过重定向的 stdout 和 stderr 流,直接向用户的 tty 发送消息。例如,mysql 能够打印密码 prom...
当 char *buf 大于 read 系统调用的 size_t 计数时,为什么 shell 会运行剩余输入?
我在 Linux 机器上的 x86-64 程序集中遇到了一个小错误或意外行为。 在 .bss 部分,我在内存中保留了 16 个字节,我称之为 name 当用户输入他们的名字时,它会...
我注意到一些开源项目中很多提到了pty和tty,有人能告诉我它们是什么意思以及它们之间有什么区别吗?
我正在阅读《TTY 揭秘》,试图对 tty、pty 有一些了解。 读完前半部分。当我输入一些内容时,我无法全面了解整个事情是如何工作的
Linux 上的 C#/.NET8:逐字符读取标准输入,而不是逐行读取(如 ~ICANON 模式)
我正在使用 C# 和 .NET 8 为 Linux 开发一个控制台应用程序。我想从标准输入读取原始数据。 使用 (var stdin = Console.OpenStandardInput()) { 而(真) { int b = stdin.ReadBy...
在 C 中,你有 isatty(file_descriptor),你可以传递 0 作为 STDIN 的文件描述符,1 作为 STDOUT 的文件描述符。 我如何在 Lua 中断言这一点?