忽略 ctrl-c

发布于 2024-07-14 07:29:29 字数 567 浏览 13 评论 0 原文

我正在尝试编写一个 shell,但现在我想忽略 CtrlC

目前,我的程序忽略 SIGINT 并在信号到来时打印新行,但如何防止打印 ^C

当按 CtrlC 时,这是我得到的:

myshell>^C
myshell>^C
myshell>^C

但我想要:

myshell>
myshell>
myshell>

这是与 CtrlC

extern "C" void disp( int sig )
{
    printf("\n");
}

main()
{
    sigset( SIGINT, disp );
    while(1)
    {
        Command::_currentCommand.prompt();
        yyparse();
    }
}

I'm trying to write a shell and I'm at the point where I want to ignore CtrlC.

I currently have my program ignoring SIGINT and printing a new line when the signal comes, but how can I prevent the ^C from being printed?

When pressing CtrlC, here is what I get:

myshell>^C
myshell>^C
myshell>^C

but I want:

myshell>
myshell>
myshell>

Here is my code relevant to CtrlC:

extern "C" void disp( int sig )
{
    printf("\n");
}

main()
{
    sigset( SIGINT, disp );
    while(1)
    {
        Command::_currentCommand.prompt();
        yyparse();
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

濫情▎り 2024-07-21 07:29:29

这是终端确实回显了那个东西。 你必须告诉它停止这样做。 我的 stty 手册页说

* [-]ctlecho
       echo control characters in hat notation (`^c')

运行 strace stty ctlecho 显示

ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(0, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig icanon echo ...}) = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0

,因此使用正确的参数运行 ioctl 可以关闭该控制回显。 查看 man termios 以获得方便的接口。 使用它们很容易

#include <termios.h>
#include <unistd.h>
#include <stdio.h>

void setup_term(void) {
    struct termios t;
    tcgetattr(0, &t);
    t.c_lflag &= ~ECHOCTL;
    tcsetattr(0, TCSANOW, &t);
}

int main() {
    setup_term();
    getchar();
}

或者,您可以考虑使用 GNU readline 来读取一行输入。 据我所知,它可以选择阻止终端执行此类操作。

It's the terminal that does echo that thing. You have to tell it to stop doing that. My manpage of stty says

* [-]ctlecho
       echo control characters in hat notation (`^c')

running strace stty ctlecho shows

ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(0, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig icanon echo ...}) = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0

So running ioctl with the right parameters could switch that control echo off. Look into man termios for a convenient interface to those. It's easy to use them

#include <termios.h>
#include <unistd.h>
#include <stdio.h>

void setup_term(void) {
    struct termios t;
    tcgetattr(0, &t);
    t.c_lflag &= ~ECHOCTL;
    tcsetattr(0, TCSANOW, &t);
}

int main() {
    setup_term();
    getchar();
}

Alternatively, you can consider using GNU readline to read a line of input. As far as i know, it has options to stop the terminal doing that sort of stuff.

溺深海 2024-07-21 07:29:29

尝试打印退格字符,又名 \b ?

Try printing the backspace character, aka \b ?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文