在 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: %s\n", 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: %s\n", name);
int r;
prompt = "login: ";
while(true)
{
std::cout << prompt << std::flush;
r = read(master, &name[0], sizeof(name)-1);
checkInput(name);
name[r] = '[=10=]';
std::printf("%s", &name[0]);
std::printf("\n");
}
close(slave);
close(master);
return 0;
}
它工作得很好,从另一个终端,我可以做到:
printf 'username' > /dev/pts/x
它将按应有的方式出现和处理。
我的问题是:当我尝试使用 screen 时,screen 终端上没有任何显示。然后当我打字时,它一次传到我的奴隶 1 个字符。
有人知道这是为什么吗?或者我该如何修复它。
如果需要,我可以提供更多细节。
谢谢:)
因为您在使用 printf
后没有刷新缓冲区。
正如保罗的回答已经表明您需要刷新缓冲区。
为此,您可以使用 tcflush 函数。
第一个参数是文件描述符的整数,第二个可以是以下之一:
TCIFLUSH 刷新系统已接收但未收到的输入数据
未被应用程序读取。
TCOFLUSH 刷新已由应用程序写入的输出数据
但没有发送到终端。
TCIOFLUSH 刷新输入和输出数据。
有关详细信息,请参阅:https://www.ibm.com/docs/en/zos/2.3.0?topic=functions-tcflush-flush-input-output-terminal
我使用以下代码在 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: %s\n", 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: %s\n", name);
int r;
prompt = "login: ";
while(true)
{
std::cout << prompt << std::flush;
r = read(master, &name[0], sizeof(name)-1);
checkInput(name);
name[r] = '[=10=]';
std::printf("%s", &name[0]);
std::printf("\n");
}
close(slave);
close(master);
return 0;
}
它工作得很好,从另一个终端,我可以做到:
printf 'username' > /dev/pts/x
它将按应有的方式出现和处理。
我的问题是:当我尝试使用 screen 时,screen 终端上没有任何显示。然后当我打字时,它一次传到我的奴隶 1 个字符。
有人知道这是为什么吗?或者我该如何修复它。
如果需要,我可以提供更多细节。
谢谢:)
因为您在使用 printf
后没有刷新缓冲区。
正如保罗的回答已经表明您需要刷新缓冲区。
为此,您可以使用 tcflush 函数。
第一个参数是文件描述符的整数,第二个可以是以下之一:
TCIFLUSH 刷新系统已接收但未收到的输入数据 未被应用程序读取。
TCOFLUSH 刷新已由应用程序写入的输出数据 但没有发送到终端。
TCIOFLUSH 刷新输入和输出数据。
有关详细信息,请参阅:https://www.ibm.com/docs/en/zos/2.3.0?topic=functions-tcflush-flush-input-output-terminal