2016-12-10 2 views
0

мне нужна помощь с msgrcv ... Мне нужно, чтобы иметь возможность получать сообщения, как это:C - сделать msgrcv сосуществовать с сигналами

while(1){ 
    int status = msgrcv(qid, &msg, sizeof(msg.data), user_id,0) 
    if(status < 0) { perror("something wrong..."); exit(1); } 
} 

А также где-то по коду:

void stuff_to_do(int signal){ 
    // .... 
} 
//... 
signal(SIGQUIT, stuff_to_do); 

Но я получаю прерванный системный вызов, возможно потому, что сигнал убивает msgrcv или что-то в этом роде. Как я могу это решить? Должен ли я fork() и выполнять msgrcv в одном процессе и делать материал на другом процессе? Или есть лучший способ? Спасибо за помощь!

+0

Не пытайтесь 'fork()' и делить задачи, которые только что усложнят. Какой бы процесс, который вызывает 'msgrcv()', все равно может получать сигналы и прерываться. – e0k

+0

@ e0k Да, это правда ... Я думал, что это решит, но это не будет, так как мне нужно остановить время (1) сигналом. Благодаря! –

ответ

1

Да, если ваш процесс получает сигнал во время msgrcv(), он будет прерван.

От man pages on msgrcv():

Вызывающий процесс получает сигнал. В этом случае системный вызов завершается с ошибкой errno установлен на EINTR. (msgrcv() никогда не перезапущен автоматически после прерывания обработчиком сигнала, независимо от установки на SA_RESTART флага при создании обработчика сигнала.)

попытаться определить это состояние отказа и только перезагрузка msgrcv() с чем-то вроде

while (1) { 
    // Try to receive message 
    errno = 0; 
    int status = msgrcv(qid, &msg, sizeof(msg.data), user_id,0) 

    if (status < 0) { 
     if (errno == EINTR) continue; // try again 

     // Something else went wrong 
     perror("something wrong..."); 
     exit(1); 
    } 
} 

не забывайте, что вы должны установить вручную errno = 0 перед операцией вы хотите проверить.

Это напоминает мне good answer, который описывает параллелизм и одновременность. Это объясняет, почему вы всегда должны использовать подход к попытке выполнить операцию, а затем проверить, удалось ли это сделать.


Смотрите также:

+0

Спасибо большое! Я проверю это. –

Смежные вопросы