2013-12-11 3 views
1

Мне нужно возобновить после звонка pause(), из того, что я прочитал в руководстве, он должен возобновиться после того, как он получит сигнал, но, по-видимому, не работает для меня, также я использую семафор, чтобы убедиться, что программа зарегистрирует обработчик сигнала, прежде чем я послать сигнал, чтобы возобновить егоКак возобновить работу после паузы()?

void child(){ 
    fprintf(stdout,"Hello!\n"); 
    exit(0); 
} 

int main(int argc, char **argv){ 
    sem_t sem; 
    sem_init(&sem,0,0); 
    int pid = fork(); 
    if(pid == 0){ 
     signal(SIGCONT, child); 
     sem_post(&sem); 
     pause(); 
    } else { 
     sem_wait(&sem); 
     kill(pid, SIGCONT); 
     int status; 
     waitpid(pid,&status, 0); 
    } 
    return EXIT_SUCCESS; 
} 

Это не фактическая программа, которую я сейчас работаю, но она имеет структуру этого.

Что происходит, что родитель висит на waitpid() и ребенок никогда не покидает pause() вызова, я знаю это, потому что он никогда не печатает сообщение "Hello!"

+0

Если это не работает, что происходит? – Xymostech

+0

Я забыл добавить это, спасибо :) –

+1

Проверьте возвращаемое значение 'sem_init'. Возможно, неназванные семафоры не поддерживаются в вашей системе. У меня это случилось со мной на машинах OS X. Изменить: Кроме того, не должен ли ваш второй аргумент отличным от нуля? «Если аргумент pshared имеет ненулевое значение, то семафор разделяется между процессами, и в этом случае любой процесс, который может обращаться к semaphore sem, может использовать sem для выполнения sem_wait(), sem_trywait(), sem_post() и sem_destroy(). " – tangrs

ответ

1

Похоже, что вы на самом деле стать жертвой отказ в разделяя семафор. Если вы будете следовать инструкциям в this answer поставить семафор в разделяемой памяти, то ваша программа работает отлично:

#include <sys/mman.h> 

... 

sem_t *sem = mmap(NULL, sizeof(sem), 
    PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, 
    -1, 0); 

(и, очевидно, заменить &sem S с sem)

+0

Огромное спасибо за ваш быстрый ответ :) –

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