Отправка Ctrl + Z в консольную программу - PullRequest
3 голосов
/ 20 октября 2010

У меня есть простая консольная программа, написанная на C, и я хочу прервать ввод текста с помощью CTRL + Z .Как это возможно?

Редактировать: Вот код (непроверенный).

#include <stdio.h>

int main()
{
    float var;

    while(1)
    {
        scanf("%lf", &var); // enter a float or press CTRL+Z

        if( ??? ) // if CTRL+Z was pressed
        {
            break;
        }

        // do something with var
    }

    printf("Job done!");

    return 0;
}

Ответы [ 3 ]

1 голос
/ 21 октября 2010

используйте signal.h , чтобы перехватить SIGTSTP, отправленное при нажатии Ctrl + z .Обратите внимание, что вы захотите перехватить SIGTSTP, а не SIGSTOP, поскольку приостановка - это обязательное действие для SIGSTOP только с помощью действия default для SIGTSTP.

Вы также можете запуститьв проблемы, не имеющие scanf() возврата, когда генерируется сигнал.К счастью для вас, этот вопрос уже был задан и довольно неплохо отвечал :) Scanf с сигналами

1 голос
/ 20 октября 2010

В основном так:

if (fgets(buf, sizeof buf, stdin)) {
    /* process valid input */
} else {
    /* Ctrl+Z pressed */
}

Могут возникнуть сложности, если вы нажмете Ctrl + Z в середине строки, но начнете с основного.ОП был обновлен

У вас есть

scanf("%lf", &var);

scanf возвращает количество выполненных им назначений.В вашем случае у вас есть только 1 переменная, поэтому scanf возвращает 1 в обычном случае или 0 в случае сбоя.Просто проверьте возвращаемое значение

int n = scanf("%lf", &var);
/* test the return value of scanf: 1 all ok; 0 no conversions; EOF: error/failure */
if (n != 1)
{
    break;
}

PS: Оу ... спецификатор "% lf" в scanf требует double, var в вашей программе - float.Исправьте это тоже

0 голосов
/ 21 октября 2010

Если вы используете UNIX-подобную операционную систему, ctrl-z отправляет SIGSTOP, который вы можете сгенерировать программно, и отловить с помощью sigaction.

...