signal(SIGALRM, handler);
alarm(5);
passphrase = getpass("Enter Passphrase:");
alarm(0);
exit(0);
void handler(int sig)
{
if(sig == SIGALRM)
printf("<Time Out> \n");
exit(0);
}
这是我的代码片段。它在5秒后超时,它打印超时,下一个命令提示符出现$,但它不再回显我键入的内容。然而它正在记录它,如果键入正确,我仍然可以执行命令
答案 0 :(得分:0)
毫无疑问getpass
(顺便说一下,你不应该使用 1 )修改终端设置以不回显密码,毫无疑问也会回显回声是否允许完成。
但是,由于您在此之前中断了它,您可能需要使用tcsetattr()
之类的内容自行恢复设置。
例如,请参阅以下程序:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <termios.h>
#include <unistd.h>
// For saving terminal status.
static struct termios tio;
static void handler (int sig) {
// Notify user, reset term status and exit.
printf("<Time Out>\n");
tcsetattr(0, TCSANOW, &tio);
exit (0);
}
int main (void) {
char *passphrase;
// Save terminal setting, probably
// need better error handling :-)
if (tcgetattr(0, &tio) != 0) {
printf ("urk!\n");
}
// Start timer, try to get input.
signal (SIGALRM, handler);
alarm (5);
passphrase = getpass ("Enter Passphrase: ");
alarm (0);
// Print it and finish up.
printf ("You entered '%s'\n", passphrase);
return 0;
}
1 它在Linux中被标记为过时,并且在前一段时间从POSIX中删除。如果您想知道在偏好中使用getpass()
的内容,请参阅上面代码中的答案。将tcsetattr()
与ECHO
选项一起使用(请记住,您的信号处理程序仍应在退出时恢复。)