Προς το περιεχόμενο

Πρόβλημα με pipe στη C


lunarosa

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια σας,

Εχω το εξης προβλημα να επιλυσω:

 

Να γραφτεί προγραμμα στη C που δημιουργει Ν διαδικασιες-παιδια και ενα pipe στο οποιο ο πατερας να μπορει να γραφει και ολα τα παιδια να μπορουν να διαβαζουν.Μετα:

-ο πατερας να γραφει το pid καθε παιδιου στο pipe

-ο πατερας να στελνει ενα σημα SIGUSR1 στο 1ο παιδι

-Αυτο το παιδι να διαβαζει τα Ν pids απο το pipe και να στελνει ενα SIGUSR2 στον πατερα του.

Αυτη η διαδικασια θα επαναλαμβανεται για καθε παιδι.

Στο τελος, το παιδι με το μεγαλυτερο pid θα γραφει τη λιστα των pids ολων των διαδικασιων-παιδιων.

----------------------------------------------------

Τα προβληματα μου ειναι οτι τα pids των παιδιων πρεπει να αποθηκευονται καπου ωστε μετα να μπορει το καθε παιδι να τα γραψει στο pipe? δλδ πρεπει να κανω κατι τετοιο *pid=fork() κατα τη δημιουργια των παιδιων ωστε να εχω πινακα με τα pids ή γίνεται μήπως με την getpid()?

Επισης τι εννοει να στελνει το σημα στον πατερα του?εννοει στο προηγουμενο παιδι???

 

Μπορει καποιος να βοηθησει?Ευχαριστω

Δημοσ.

Αυτό κάτι μου θυμίζει από λειτουργικά συστήματα υπολογιστών στη Σημμυ ;) ... κάθε pid=fork() κάνεις θα το κρατάς σε μια λίστα. Ώστε να έχεις τα pid των παιδιών. Όταν λέει να στέλνει το σήμα στον πατέρα του εννοεί να στέλνει το σήμα στο αρχικό πρόγραμμα [θα το έχεις πάρει το pid του "πατέρα" με την getpid]

Δημοσ.

Ευχαριατώ panagath αλλά:

Απλά,λεει οτι το παιδι διαβαζει τα Ν pids και μετα στελνει σημα.Αρα η διαδικασια δημιουργιας εχει ολοκληρωθει και μετα θα στειλει σημα.

Τοτε πως θα γινει αυτο για καθε παιδι?Δεν πρεπει να γινει μια φορα αφου τελειωσει η διαδικασια δημιουργιας?Ελπιζω να ειμαι κατανοητη!

(Δεν ειναι παντως Σημμυ!!)

Δημοσ.

Ο παρακάτω κώδικας σου λύνει το πρόβλημα με τα παιδιά και τα σήματα (νομίζω, και εφόσον έχω καταλάβει τα ερωτήματα)

 

>
#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 το αφήνω σε εσένα ...

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...