Prozesse Threads und Signale



  • Ich habe mittlerweile einiges ueber prozesse, threads und signale gelesen.
    (fork, pthread, clone etc.)
    was mir jedoch noch fehlt ist ein konkretes beispiel das mir zeigt wie ich einen prozess oder einen thread wieder mit einen signal aufwecken kann.
    ueberall steht das signale die einfachste form der IPC (Interprocess Communivation) sind, und ich vermute dass es recht einfach ist - aber wie?

    idealerweise suche ich ein einfaches beispiel:

    pseudo code

    childpid=create_prozess();
    go_sleeping_and_wait_for_signal();
    send_signal(childpid, data_to_send);
    handle_signal();

    Bin fuer links und beispiele dankbar 😉



  • Moin,

    das, was du suchst, sind sog. Condition-Variablen. Diese kommen bei der Pthreads-Bibliothek zur Threadsynchronisation zum Einsatz. Beispiel:

    #include <pthread.h>
    #include <unistd.h>
    #include <stdio.h>
    
    pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
    pthread_cond_t con = PTHREAD_COND_INITIALIZER;
    
    void t1 (void* nothing)
    {
            pthread_mutex_lock(&mut);
            pthread_cond_wait(&con, &mut);
            printf("ich bin aufgeweckt worden!!\n");
            fflush(stdout);
            pthread_mutex_unlock(&mut);
    }
    
    int main ()
    {
            pthread_t t;
            pthread_create(&t, NULL, (void*) t1, NULL);
            sleep(5);
            pthread_mutex_lock(&mut);
            pthread_cond_signal(&con);
            pthread_mutex_unlock(&mut);
            return 0;
    }
    

    Zur "richtigen" IPC sind mir nur named/unnamed Pipes und das System V Modell bekannt. Pthreads ist aber deutlich effizienter und einfacher zu benutzen.



  • Original erstellt von Belgarad:
    **[...]
    childpid=create_prozess();
    go_sleeping_and_wait_for_signal();
    send_signal(childpid, data_to_send);
    handle_signal();
    **

    In ANSI-C (ohne POSIX Threads) heißt das (Quick and dirty, nur so als Ansatz):

    int child_pid = fork();
    if (child_pid == 0)  /* Child Process */
     {
      ...
      kill(getppid(), SIGCHLD);  /* Parent process "wecken" */
      ...
     }
    else  /* Parent process */
      wait_pid(child_pid, NULL, 0);
    

    Statt des Signals SIGCHLD sollte man besser ein User-Signal verwenden. Dazu musst du dann aber erst einen Signalhandler mit der Funktion signal() einrichten.

    Genaueres findest du in meinem Buch "C und Linux" 😉

    Martin



  • Vielen Dank,

    das sind die hinweise die ich gesucht habe.

    @Martin
    Das Inhaltsverzeichnis deines Buches sieht sehr gut aus *respekt*. Ich denke ich werde es mir bestellen.



  • ansonsten gibt es hier auch ganz gute kostenlose beschreibungen. http://www.gnu.org/manual/glibc-2.2.3/libc.html

    Gruß Patrick


Anmelden zum Antworten