我使用poll()getpass()在有限的时间内从用户获取输入。它可以工作,但不是显示message中给定的getpass(),而是在按message之前不显示enter key。如何同时使用这两个功能,以便在不需要输入message的情况下显示getpass()中给定的enter key,并限制输入密码的时间?
我试图通过清除stdinstdout来解决这个问题,但是没有成功。

#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/

10-12 16:18