【问题标题】:How to return in case of ctr+c in getline?getline中ctr+c如何返回?
【发布时间】:2021-02-27 20:24:06
【问题描述】:

我知道在使用“getline”获取输入时如何忽略 Ctrl+C 之类的信号,但是当发送 SIGINT 信号时,我很难将继续消息发送到 while 循环让我告诉你我的意思。

这就是我想要得到的效果。就像您在 bash 终端中单击 Ctrl+c 时得到的一样。

每当您发送 SIGINT 信号时,都会打印一个换行符并继续循环。这是我目前拥有的代码。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>

void handlec(int sig)
{
    signal(sig, handlec);
    printf("\n");
}

int main(void)
{
    char *cmd = NULL;
    size_t len;

    signal(SIGINT, handlec);

    while (1)
    {
        printf("insert ");
        getline(&cmd, &len, stdin);
    }
    return (1);
}

在这个程序中,当按下ctr+c 时,会打印相同的^C 消息并打印新行,但循环不会自动继续,直到用户按下&lt;RETURN&gt;。你会如何处理这个问题?我尝试使用 goto 循环,但没有全局标签之类的东西,因此很难将 main 函数中的 while 循环从另一个函数中引导出来。如果重要的话,我会使用我自己的 getline 函数,所以如果有必要,我可以在那里进行任何操作。

【问题讨论】:

    标签: c signals getline sigint


    【解决方案1】:

    在信号处理程序中重新安装信号处理程序的习惯用法表明您预期信号处理程序会自行解除和中断的历史行为被破坏。这仍然是标准允许的,但不是任何现代系统的行为。您应该忘记旧的signal 函数并使用sigaction,它可以让您控制您想要的行为。

    struct sigaction sa = { .sa_handler = handler, /* .sa_flags = 0 */ };
    sigaction(SIGINT, &sa, 0);
    

    默认标志(不包括SA_RESTART)将为您提供您想要的行为(中断getline 并导致它返回EINTR 错误)。您不需要从自身重新武装信号处理程序。你也不能从那里使用printf;您必须使用 write 或其他一些异步信号安全函数来产生输出。

    【讨论】:

      猜你喜欢
      • 2010-09-20
      • 2016-02-18
      • 2011-06-10
      • 2016-01-26
      • 1970-01-01
      • 2011-04-02
      • 2021-05-26
      • 1970-01-01
      相关资源
      最近更新 更多