Возвращаясь из обработчиков сигналов - PullRequest
5 голосов
/ 29 ноября 2011

Не правильно ли я покидаю свой обработчик сигналов?Кажется, он не возвращается в программу нормально.Вместо этого он входит в цикл и там, где он должен ждать ввода пользователя, пропускает и считывает длину «ввода пользователя» до -1 и выдает ошибки.(В коде будет больше смысла.)

void handle_SIGINT() {

    int k = recent;
    int count = 0;
    int stop;

    if (stringSize >= 10) {
        stop = 10;
    }
    else {
        stop = p;
    }

    printf("\nCommand History:\n");

    for (count = 0; count < stop; count++) {

        if (k < 0) {
            k += 10;
        }
        printf("%s", string[abs(k)]);
        k -= 1;

    }

}



void setup(char inputBuffer[], char *args[],int *background)
{
    //char inputBuffer[MAX_LINE];
    int length, /* # of characters in the command line */
    i,      /* loop index for accessing inputBuffer array */
    start,  /* index where beginning of next command parameter is */
    ct;     /* index of where to place the next parameter into args[] */
    int add = 1;
    ct = 0;

    /* read what the user enters on the command line */
    length = read(STDIN_FILENO, inputBuffer, MAX_LINE);  


        printf("%i",length);
    start = -1;
    if (length == 0)
        exit(0);            /* ^d was entered, end of user command stream */
    if (length < 0){
        perror("error reading the commanddddddddd");
        exit(-1);           /* terminate with error code of -1 */
    }
}



int main(void)
{
    char inputBuffer[MAX_LINE]; /* buffer to hold the command entered */
    int background;             /* equals 1 if a command is followed by '&' */
    char *args[MAX_LINE/2+1];/* command line (of 80) has max of 40 arguments */
    FILE *inFile = fopen("pateljay.history", "r");



    if (inFile != NULL) {
        int count = 0;
        char line[MAX_LINE];
        while (fgets(line,sizeof line, inFile) != NULL) {
            string[count] = strdup(line);
            //string[count][strlen(line)] = '\n';
            //string[count][strlen(line) + 1] = '\0';
            printf("%s", string[count]);
            count++;
            stringSize++;
        }


            p = count % 10;
            recent = abs(p - 1);

    }   

    fclose(inFile); 

    /* set up the signal handler */
    struct sigaction handler;
    handler.sa_handler = handle_SIGINT;
    sigaction(SIGINT, &handler, NULL);

    while (1) {/* Program terminates normally inside setup */


        background = 0;
        printf("COMMAND->");

        fflush(0);

        setup(inputBuffer, args, &background);/* get next command */
    }
}

Так что, когда вводятся ctrl + c, он должен ловить сигнал и обрабатывать его.Как только он возвращается к основному, он входит в настройку и полностью пропускает функцию чтения и принимает длину, равную -1.Это в свою очередь приводит к ошибкам программы.Я думаю, что код внутри handle_SIGINT не имеет значения, как сейчас.Кто-нибудь знает какие-либо причины, по которым было бы пропустить функцию чтения в настройках?

Ответы [ 2 ]

8 голосов
/ 29 ноября 2011

read блокирует, ждет ввода. SIGINT прибывает. Ядро вызывает ваш обработчик сигнала. Когда ваш обработчик сигнала возвращается, ядро ​​возвращает read return -1 и устанавливает errno в EINTR. Вам нужно проверить этот случай и обработать его, снова вызвав read:

   do {
        length = read(STDIN_FILENO, inputBuffer, MAX_LINE);
   } while (length == -1 && errno == EINTR);
1 голос
/ 29 ноября 2011

Предполагается, что обработчик сигнала принимает аргумент int:

void handle_sigint(int signum) {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...