SIGACTION 处理程序在中断后重复加载
SIGACTION handler to repeat loading after interruption
嗨,Whosebug 家族,
我正在做一个 uni 任务来制作一个 linux 程序来读取密码并保护它,如果用户在此期间中断密码,则再次“重新读取”密码。
这是我的捕获处理程序的代码。
void catch_suspend(int sig_num)
{
printf("\nSuspending execution...\n");
fflush(stdout);
echo_on(YES); // re-enable echo mode
raise(SIGSTOP); // stop self
// we'll get back here when the process is resumed
printf("Resuming execution...\n");
echo_on(NO); // disable echo mode again
printf("Password: "); // reproduce the prompt
fflush(stdout);
}
这里是主程序
int main(int argc, char *argv[])
{
#define MAX_SIZE 30
char user[MAX_SIZE]; // user name supplied by the user
char passwd[MAX_SIZE]; // password supplied by the user
sigset_t sigs;
struct sigaction sa_new;
memset(&sa_new, 0, sizeof(sa_new)); // initialization to zeros
sa_new.sa_handler = catch_suspend; // set handler
sigemptyset(&sa_new.sa_mask); // mask: empty set
sigaddset(&sa_new.sa_mask, SIGINT); // mask: add SIGINT
sigaddset(&sa_new.sa_mask, SIGQUIT); // mask: add SIGQUIT
sa_new.sa_flags = 0; // no flags
printf("Username: "); // prompt the user for a user name
fflush(stdout);
fgets(user, MAX_SIZE, stdin); // wait for input
sigaction(SIGTSTP, &sa_new, &sa_old); // set the handler for SIGTSTP and get old handler setting
printf("Password: "); // prompt the user for a password
fflush(stdout);
echo_on(NO); // set input to no-echo mode
fgets(passwd, MAX_SIZE, stdin); // get the user input
echo_on(YES); // re-enable echo on input
printf("\n"); // the Enter pressed by the user was not echoed
fflush(stdout);
// verify the password (\n is stored, don't compare it)
etc...
return 0;
我还应该阻止除 SIGINT 和 SIGQUIT 之外的所有信号,不确定我是否正确地使用了掩码。我现在遇到的问题是这样的:密码读取过程中中断后,进程停止。没关系。但是在我使用“fg”命令继续之后,我的处理程序只写入输出并且程序结束,但我需要它 运行 fgets(passwd, MAX_SIZE, stdin)(停止的地方)。
我想我可能没有正确设置 old_action,但我读过的手册并没有真正让我更清楚。谁能伸出援手?
好的,我终于弄明白了,我会把它留在这里,供遇到同样问题的人使用。
我没有设置 sigaction 标志如下:
sa_new.sa_flags = SA_RESTART;
此标志控制在某些原语(例如打开、读取或写入)和信号处理程序 return 期间传递信号时发生的情况。有两种选择:库函数可以恢复,或者可以 return 失败,错误代码为 EINTR。
选择由 SA_RESTART 标志控制,用于传送的特定类型的信号。如果设置了标志,returning 从处理程序恢复库函数。如果标志已清除,return从处理程序中调用会使函数失败
嗨,Whosebug 家族,
我正在做一个 uni 任务来制作一个 linux 程序来读取密码并保护它,如果用户在此期间中断密码,则再次“重新读取”密码。
这是我的捕获处理程序的代码。
void catch_suspend(int sig_num)
{
printf("\nSuspending execution...\n");
fflush(stdout);
echo_on(YES); // re-enable echo mode
raise(SIGSTOP); // stop self
// we'll get back here when the process is resumed
printf("Resuming execution...\n");
echo_on(NO); // disable echo mode again
printf("Password: "); // reproduce the prompt
fflush(stdout);
}
这里是主程序
int main(int argc, char *argv[])
{
#define MAX_SIZE 30
char user[MAX_SIZE]; // user name supplied by the user
char passwd[MAX_SIZE]; // password supplied by the user
sigset_t sigs;
struct sigaction sa_new;
memset(&sa_new, 0, sizeof(sa_new)); // initialization to zeros
sa_new.sa_handler = catch_suspend; // set handler
sigemptyset(&sa_new.sa_mask); // mask: empty set
sigaddset(&sa_new.sa_mask, SIGINT); // mask: add SIGINT
sigaddset(&sa_new.sa_mask, SIGQUIT); // mask: add SIGQUIT
sa_new.sa_flags = 0; // no flags
printf("Username: "); // prompt the user for a user name
fflush(stdout);
fgets(user, MAX_SIZE, stdin); // wait for input
sigaction(SIGTSTP, &sa_new, &sa_old); // set the handler for SIGTSTP and get old handler setting
printf("Password: "); // prompt the user for a password
fflush(stdout);
echo_on(NO); // set input to no-echo mode
fgets(passwd, MAX_SIZE, stdin); // get the user input
echo_on(YES); // re-enable echo on input
printf("\n"); // the Enter pressed by the user was not echoed
fflush(stdout);
// verify the password (\n is stored, don't compare it)
etc...
return 0;
我还应该阻止除 SIGINT 和 SIGQUIT 之外的所有信号,不确定我是否正确地使用了掩码。我现在遇到的问题是这样的:密码读取过程中中断后,进程停止。没关系。但是在我使用“fg”命令继续之后,我的处理程序只写入输出并且程序结束,但我需要它 运行 fgets(passwd, MAX_SIZE, stdin)(停止的地方)。
我想我可能没有正确设置 old_action,但我读过的手册并没有真正让我更清楚。谁能伸出援手?
好的,我终于弄明白了,我会把它留在这里,供遇到同样问题的人使用。
我没有设置 sigaction 标志如下:
sa_new.sa_flags = SA_RESTART;
此标志控制在某些原语(例如打开、读取或写入)和信号处理程序 return 期间传递信号时发生的情况。有两种选择:库函数可以恢复,或者可以 return 失败,错误代码为 EINTR。
选择由 SA_RESTART 标志控制,用于传送的特定类型的信号。如果设置了标志,returning 从处理程序恢复库函数。如果标志已清除,return从处理程序中调用会使函数失败