我使用poll()
和getpass()
在有限的时间内从用户获取输入。它可以工作,但不是显示message
中给定的getpass()
,而是在按message
之前不显示enter key
。如何同时使用这两个功能,以便在不需要输入message
的情况下显示getpass()
中给定的enter key
,并限制输入密码的时间?
我试图通过清除stdin
和stdout
来解决这个问题,但是没有成功。
#include <poll.h>
struct pollfd mypoll = { STDIN_FILENO, POLLIN|POLLPRI };
if( poll(&mypoll, 1, 20000) )
{
char *pass = getpass("\nPlease enter password:");
}
最佳答案
getpass函数已过时。不要用它。
这是一个有效的例子。程序等待20秒。如果用户在20秒内输入密码,则程序会将信息读取到密码,否则会通知用户输入密码的时间已超过。下面的示例不会取消echo。
#include <unistd.h>
#include <poll.h>
#include <stdio.h>
int main()
{
struct pollfd mypoll = { STDIN_FILENO, POLLIN|POLLPRI };
char password[100];
printf("Please enter password\n");
if( poll(&mypoll, 1, 20000) )
{
scanf("%99s", password);
printf("password - %s\n", password);
}
else
{
puts("Time Up");
}
return 0;
}
下面的示例将关闭echo。与getpass相同。这在linux/macosx上有效,windows版本应该使用Get/Set ConsoleMode
#include <unistd.h>
#include <poll.h>
#include <stdio.h>
#include <termios.h>
#include <stdlib.h>
int main()
{
struct pollfd mypoll = { STDIN_FILENO, POLLIN|POLLPRI };
char password[100];
struct termios oflags, nflags;
/* disabling echo */
tcgetattr(fileno(stdin), &oflags);
nflags = oflags;
nflags.c_lflag &= ~ECHO;
nflags.c_lflag |= ECHONL;
if (tcsetattr(fileno(stdin), TCSANOW, &nflags) != 0) {
perror("tcsetattr");
return EXIT_FAILURE;
}
printf("Please enter password\n");
if( poll(&mypoll, 1, 20000) )
{
scanf("%s", password);
printf("password - %s\n", password);
}
else
{
puts("Time Up");
}
/* restore terminal */
if (tcsetattr(fileno(stdin), TCSANOW, &oflags) != 0) {
perror("tcsetattr");
return EXIT_FAILURE;
}
return 0;
}
关于c - 如何将getpass()与poll()一起使用来设置时间限制?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32838026/