2013-04-13 20 views
15

Jestem całkowicie noob w c. Muszę napisać funkcję mypause(), która powinna mieć funkcjonalność podobną do wywołania systemowego pause() i przetestować funkcję mypause() w programie, który wielokrotnie blokuje oczekiwanie na sygnał. Jak działa funkcja te pause()? Nie mogę po prostu zrobić mypause() takiego:Jak działa funkcja pause()?

fprintf(stderr, "press any key to continue\n"); 

celem programu do bloku i czekać na sygnał?

Pamiętaj, że nigdy nie będę mógł używać pause() ani sigpause().

+0

Więc chcesz poczekać na kluczowy skok? – m0skit0

+1

Brzmi jak zadanie domowe. Powinien być oznaczony jako taki? W każdym razie myślę, że nie do końca rozumiesz problem, który chcesz rozwiązać. Wywołanie pause() NIE czeka na dane wprowadzone przez użytkownika. –

+0

tj. Zdarzenia klawiatury nie są sygnałami w tym sensie, jak tutaj wymagane. –

Odpowiedz

13

Funkcja pause() blokuje do momentu nadejścia sygnału. Dane wejściowe użytkownika nie są sygnałami. Sygnał może być emitowany przez inny proces lub sam system.

Naciśnięcie Ctrl-C na przykład, powoduje powłokę wysłać sygnał SIGINT do bieżącego uruchomionego procesu, który w normalnychprzypadkach powoduje proces zostać zabity.

Aby emulować zachowanie się pause w ISO C99, można napisać coś takiego. Kod jest komentowany, jeśli masz pytanie dotyczące tej implementacji, zapytaj.

#include <unistd.h> 
#include <stdio.h> 
#include <signal.h> 

/** 
* The type sig_atomic_t is used in C99 to guarantee 
* that a variable can be accessed/modified in an atomic way 
* in the case an interruption (reception of a signal for example) happens. 
*/ 
static volatile sig_atomic_t done_waiting = 0; 

static void  handler() 
{ 
    printf("Signal caught\n"); 
    done_waiting = 1; 
} 

void my_pause() 
{ 
    /** 
    * In ISO C, the signal system call is used 
    * to call a specific handler when a specified 
    * signal is received by the current process. 
    * In POSIX.1, it is encouraged to use the sigaction APIs. 
    **/ 
    signal(SIGINT, handler); 
    done_waiting = 0; 
    while (!done_waiting) 
    ; 
} 

int  main() 
{ 
    my_pause(); 
    printf("Hey ! The first call to my_pause returned !\n"); 
    my_pause(); 
    printf("The second call to my_pause returned !\n"); 
    return (0); 
} 

Uwaga Ten przykład działa tylko z sygnałem SIGINT. Aby obsłużyć dodatkowy zestaw sygnałów, można użyć innych połączeń do signal() z różnymi numerami sygnałów lub użyć sigaction() z maską określającą wszystkie pożądane sygnały.

Pełna lista dostępnych sygnałów w twoim systemie znajduje się w tobie <signal.h>.

+4

Zajęty czekanie jest złe. Uśpij w tej pętli. – Dave

+1

(sen obudzi się wcześnie dla sygnałów) – Dave

+1

Dzięki Halim Qarroum to jest dokładnie to, czego potrzebowałem. –