lunarosa Δημοσ. 2 Ιουνίου 2010 Δημοσ. 2 Ιουνίου 2010 Γεια σας, Εχω το εξης προβλημα να επιλυσω: Να γραφτεί προγραμμα στη C που δημιουργει Ν διαδικασιες-παιδια και ενα pipe στο οποιο ο πατερας να μπορει να γραφει και ολα τα παιδια να μπορουν να διαβαζουν.Μετα: -ο πατερας να γραφει το pid καθε παιδιου στο pipe -ο πατερας να στελνει ενα σημα SIGUSR1 στο 1ο παιδι -Αυτο το παιδι να διαβαζει τα Ν pids απο το pipe και να στελνει ενα SIGUSR2 στον πατερα του. Αυτη η διαδικασια θα επαναλαμβανεται για καθε παιδι. Στο τελος, το παιδι με το μεγαλυτερο pid θα γραφει τη λιστα των pids ολων των διαδικασιων-παιδιων. ---------------------------------------------------- Τα προβληματα μου ειναι οτι τα pids των παιδιων πρεπει να αποθηκευονται καπου ωστε μετα να μπορει το καθε παιδι να τα γραψει στο pipe? δλδ πρεπει να κανω κατι τετοιο *pid=fork() κατα τη δημιουργια των παιδιων ωστε να εχω πινακα με τα pids ή γίνεται μήπως με την getpid()? Επισης τι εννοει να στελνει το σημα στον πατερα του?εννοει στο προηγουμενο παιδι??? Μπορει καποιος να βοηθησει?Ευχαριστω
panagath Δημοσ. 2 Ιουνίου 2010 Δημοσ. 2 Ιουνίου 2010 Αυτό κάτι μου θυμίζει από λειτουργικά συστήματα υπολογιστών στη Σημμυ ... κάθε pid=fork() κάνεις θα το κρατάς σε μια λίστα. Ώστε να έχεις τα pid των παιδιών. Όταν λέει να στέλνει το σήμα στον πατέρα του εννοεί να στέλνει το σήμα στο αρχικό πρόγραμμα [θα το έχεις πάρει το pid του "πατέρα" με την getpid]
lunarosa Δημοσ. 2 Ιουνίου 2010 Μέλος Δημοσ. 2 Ιουνίου 2010 Ευχαριατώ panagath αλλά: Απλά,λεει οτι το παιδι διαβαζει τα Ν pids και μετα στελνει σημα.Αρα η διαδικασια δημιουργιας εχει ολοκληρωθει και μετα θα στειλει σημα. Τοτε πως θα γινει αυτο για καθε παιδι?Δεν πρεπει να γινει μια φορα αφου τελειωσει η διαδικασια δημιουργιας?Ελπιζω να ειμαι κατανοητη! (Δεν ειναι παντως Σημμυ!!)
pinball_elf Δημοσ. 2 Ιουνίου 2010 Δημοσ. 2 Ιουνίου 2010 Ο παρακάτω κώδικας σου λύνει το πρόβλημα με τα παιδιά και τα σήματα (νομίζω, και εφόσον έχω καταλάβει τα ερωτήματα) > #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <signal.h> #include <unistd.h> #define N 5 int next_child = 0; pid_t pid_data[N]; int pipe_fds[2]; void handle_signal (int); int main (void) { int i; /* create pipe */ if (pipe(pipe_fds) == -1) { fprintf(stderr, "pipe error!"); exit(-1); } for (i=0;i<N;i++) { pid_data[i] = fork(); if (pid_data[i] == -1) { fprintf(stderr, "fork error!"); exit(-1); } else { if (pid_data[i] == 0) { /* child */ signal(SIGUSR1, handle_signal); for(; sleep(1); /* wait for a SIGUSR1 signal forever */ } } } signal(SIGUSR2, handle_signal); /* none child should reach this far */ /* write pipe_fd [0] */ kill(pid_data[next_child], SIGUSR1); for(; sleep(1); /* wait for a SIGUSR2 signal forever */ exit(0); } void handle_signal (int signal_no) { if (signal_no == SIGUSR1) { fprintf(stdout, "child with %d pid got SIGUSR1 signal!\n", getpid()); /* read pipe_fd[0] and determine if the pid list should be printed or */ /* send parent a SIGUSR2 signal */ if (kill(getppid(), SIGUSR2) == -1) { fprintf(stderr, "child with %d pid got kill error!\n", getpid()); exit(-1); } exit(0); } else if (signal_no == SIGUSR2) { fprintf(stdout, "parent got SIGUSR2 signal!\n"); if (next_child + 1 == N) { /* close pipe */ close(pipe_fds[0]); close(pipe_fds[1]); exit(0); } else { next_child++; kill(pid_data[next_child], SIGUSR1); } } } Το pipe read/write το αφήνω σε εσένα ...
lunarosa Δημοσ. 4 Ιουνίου 2010 Μέλος Δημοσ. 4 Ιουνίου 2010 Ευχαριστώ πολύ!Νομίζω οτι ειναι πολύ σωστό!
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.