在C 中创建一个可以由其他程序使用的伪终端
Creating a pseudo terminal in C++ that can be used by other programs
我使用以下代码在C 中创建了一个伪终端:
int main(int, char const *[])
{
int master, slave;
char name[1024];
char mode[] = "0777"; //I know this isn't good, it is for testing at the moment
int access;
int e = openpty(&master, &slave, &name[0], 0, 0);
if(0 > e) {
std::printf("Error: %sn", strerror(errno));
return -1;
}
if( 0 != unlockpt(slave) )
{
perror("Slave Error");
}
access = strtol(mode, 0, 8);
if( 0 > chmod(name, access) )
{
perror("Permission Error");
}
//std::cout << "Master: " << master << std::endl;
std::printf("Slave PTY: %sn", name);
int r;
prompt = "login: ";
while(true)
{
std::cout << prompt << std::flush;
r = read(master, &name[0], sizeof(name)-1);
checkInput(name);
name[r] = ' ';
std::printf("%s", &name[0]);
std::printf("n");
}
close(slave);
close(master);
return 0;
}
从另一个终端我可以做的是:
,它的工作原理非常好。printf'用户名'>/dev/pts/x
它将出现并按照应有的方式进行处理。
我的问题是:当我尝试使用屏幕时,屏幕终端上没有任何内容。然后,当我输入时,它一次贯穿我的从1个字符。
有人知道为什么这是吗?或我如何修复它。
如果需要,我可以提供更多细节。
谢谢:)
,因为您使用printf
后没有冲洗缓冲区。
pauls答案已经表明您需要冲洗缓冲区。
这样做,您可以使用tcflush函数。
第一个参数是文件描述符的int,第二个参数可以是以下内容之一:
-
tciflush冲洗系统已收到的输入数据,但不通过应用程序阅读。
-
tcoflush刷新了由应用程序编写的输出数据但未发送到终端。
-
tcioflush冲洗输入和输出数据。
有关更多信息,请参见: https://www.ibm.com/docs/en/zos/2.3.0?topic=functions-tcflush-flush-flush-input-input-input-unput-xtup-terminal
相关文章:
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 如何在程序执行时查看Valgrind Massif输出(或其他堆分析器)?
- 在Visual Studio中单实例Qt应用程序版本5.11.1中,在所有其他窗口的顶部打开Qt MainWindow
- 程序没有问 3 个问题,而是将我对第一个问题的回答用于其他两个问题
- C++ - 从 MFC 应用程序启动记事本,并将其默认标题从 "Untitled - Notepad" 更改为其他内容
- 钩子SSDT.其他驱动程序使用我的函数
- 从 Windows 中的其他应用程序 GUI 中提取数据
- C++ 从 'main' 中运行其他程序的最佳实践
- FIFO块程序,直到其他进程读取
- 打开应用程序主窗口 在系统托盘图标中的其他应用程序之上
- 如何在没有作弊引擎的情况下从其他应用程序获取指针地址?
- 程序在其中一个案例完成后终止,但对于其他情况则不终止
- Xlib XSENDEVENT在其他应用程序/过程中
- 防止从其他程序执行库中的函数
- Windows 10 是否保护您不访问其他程序正在使用的内存?
- 如何计算该程序的复杂性?是否有任何其他复杂性较低的解决方案
- CreateProcess:某些应用程序运行其他应用程序
- 缓冲区溢出到其他 exe 的内存中?还是从远程桌面程序到 csrss.exe?
- 程序在C++ Tutor中执行时有效,但在其他任何地方都不起作用
- 有人可以向我解释一下这段代码是如何工作的吗?(程序在预期数值且用户输入其他输入时再次要求用户输入)