سؤال

وأنا أحاول أن أكتب قذيفة وأنا عند النقطة التي أريد أن تجاهل السيطرة C .

ولدي حاليا برنامجي تتجاهل SIGINT والطباعة خط جديد عندما تأتي إشارة، ولكن كيف يمكنني منع ^C من تتم طباعتها؟

عند الضغط على السيطرة C ، وهنا هو ما يحصل:

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

ولكن أريد:

myshell>
myshell>
myshell>

وهنا هو رمز بلادي صلة السيطرة C :

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

main()
{
    sigset( SIGINT, disp );
    while(1)
    {
        Command::_currentCommand.prompt();
        yyparse();
    }
}
هل كانت مفيدة؟

المحلول

وانها محطة التي لا صدى هذا الشيء. يجب أن نقول أن يتوقف عن فعل ذلك. بلدي manpage من 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 لقراءة سطر الإدخال. وبقدر ما أعرف، فإنه لديها خيارات لوقف محطة تفعل هذا النوع من الاشياء.

نصائح أخرى

وحاول طباعة حرف مسافة للخلف، ويعرف أيضا باسم \ ب؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top