捕捉 CTRL-\ 信号
Catch CTRL-\ signal
我有一个用户定义的 shell 项目,我在其中尝试执行 cat
命令但允许用户单击 CTRL-/
以显示下一个 x 行。我是信号的新手,所以我想我在某处有语法错误...
主要...
while (fgets(buf, sizeof(buf), file) != NULL){ //CITE
//print out first four lines
if (j == 0){
for (i = 0; i < 4; i++){
printf("%s", buf);
fgets(buf, sizeof(buf), file);
}
j++;
}
signal(SIGQUIT, sig_int);
//now check for user input for the next x lines
if (keepRunning){
for (i = 0; i < 4; i++){
printf("%s", buf);
if (i < 3){
if (fgets(buf, sizeof(buf), file) == NULL){
fclose(file);
return 0;
}
}
}
keepRunning = 0;
}
然后我定义了以下sig_int函数...
static volatile int keepRunning = 0;
void sig_int(int sig){
keepRunning = 1;
}
主要问题是当没有收到信号时,你不会在任何地方减速或停车。例如,您可以使用 pause()
;收到信号时仅需 return 秒。然后,您将使用它代替 if (keepRunning)
块(包括条件)。
或者,您可以修改终端模式,以便在输入字符时发送字符('raw' 模式),并在继续之前尝试读取字符。但是,如果您这样做,您就有责任确保在尽可能多的情况下在程序退出之前重置终端模式。好消息是在原始模式下键盘不会产生任何信号,但你不必担心来自其他地方的信号。
您可能想让其他信号唤醒程序并退出循环,但如果您没有为它们设置信号处理程序,那将自动发生。也就是说,在 pause()
returns 之后(它总是 return 具有错误状态并且 errno
设置为 EINTR),您可能会检查 keepRunning
现在是否1 如果没有则退出循环。
我有一个用户定义的 shell 项目,我在其中尝试执行 cat
命令但允许用户单击 CTRL-/
以显示下一个 x 行。我是信号的新手,所以我想我在某处有语法错误...
主要...
while (fgets(buf, sizeof(buf), file) != NULL){ //CITE
//print out first four lines
if (j == 0){
for (i = 0; i < 4; i++){
printf("%s", buf);
fgets(buf, sizeof(buf), file);
}
j++;
}
signal(SIGQUIT, sig_int);
//now check for user input for the next x lines
if (keepRunning){
for (i = 0; i < 4; i++){
printf("%s", buf);
if (i < 3){
if (fgets(buf, sizeof(buf), file) == NULL){
fclose(file);
return 0;
}
}
}
keepRunning = 0;
}
然后我定义了以下sig_int函数...
static volatile int keepRunning = 0;
void sig_int(int sig){
keepRunning = 1;
}
主要问题是当没有收到信号时,你不会在任何地方减速或停车。例如,您可以使用 pause()
;收到信号时仅需 return 秒。然后,您将使用它代替 if (keepRunning)
块(包括条件)。
或者,您可以修改终端模式,以便在输入字符时发送字符('raw' 模式),并在继续之前尝试读取字符。但是,如果您这样做,您就有责任确保在尽可能多的情况下在程序退出之前重置终端模式。好消息是在原始模式下键盘不会产生任何信号,但你不必担心来自其他地方的信号。
您可能想让其他信号唤醒程序并退出循环,但如果您没有为它们设置信号处理程序,那将自动发生。也就是说,在 pause()
returns 之后(它总是 return 具有错误状态并且 errno
设置为 EINTR),您可能会检查 keepRunning
现在是否1 如果没有则退出循环。