gpt4 book ai didi

捕获 CTRL-\信号

转载 作者:行者123 更新时间:2023-11-30 17:08:22 32 4
gpt4 key购买 nike

我有一个用户定义的 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() , 例如;它仅在收到信号时返回。然后,您可以使用它来代替 if (keepRunning) block (包括条件)。

或者,您可以修改终端模式,以便在键入字符时发送字符(“原始”模式),并在继续之前尝试读取字符。但是,如果您这样做,您就有责任确保在尽可能多的情况下程序退出之前重置终端模式。好消息是,在原始模式下键盘不会生成任何信号,但您必须担心来自其他地方的信号。

您可能想让其他信号唤醒程序并退出循环,但如果您没有为它们设置信号处理程序,那么这会自动发生。也就是说,在 pause() 返回后(它总是返回错误状态并且 errno 设置为 EINTR),您可以检查是否 keepRunning现在为 1,如果不是则退出循环。

关于捕获 CTRL-\信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33695698/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com