gio@ Δημοσ. 14 Απριλίου 2010 Δημοσ. 14 Απριλίου 2010 Να γραφούν δύο προγράμματα σε C τα οποία θα επικοινωνούν μεταξύ τους με τη χρήση fifo. Το πρώτο πρόγραμμα θα ζητάει από το χρήστη έναν αριθμό Χ και θα εκτελεί έναν βρόχο για περίπου 2*Χ δευτερόλεπτα. Στη διάρκεια του βρόχου θα προσμετράει των αριθμό των σημάτων SIGUSR1 που έλαβε και ταυτόχρονα θα τυπώνει στην οθόνη και ένα μήνυμα "ΕΛΑΒΑ ΣΗΜΑ" κάθε φορά που λαμβάνει ένα σήμα SIGUSR1. Το δεύτερο πρόγραμμα θα στέλνει ένα σήμα SIGUSR1 στο πρώτο πρόγραμμα, κάθε φορά που ο χρήστης θα πατάει ένα πλήκτρο (πχ Enter) και θα τερματίζει αυτόματα μετά από 3*Χ δευτερόλεπτα. Στο τέλος της εκτέλεσης του πρώτου προγράμματος θα τυπώνεται ο συνολικός αριθμός σημάτων που έλαβε! >#include <stdio.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <signal.h> int x; void myfunc(int sig) { printf("ELAVA SHMA\n"); } int main() printf("plhktrologeiste enan arithmo:\n"); scanf("%d",&x); for(i=0;i=2*x;i=i+1) { if ((fd = open("FIFO", O_RDWR | O_NONBLOCK)) == -1){ fprintf(stderr, "Sender: fifo open failed.\n"); exit(3); signal(SIGUSR1, myfunc); } return 0; } Εχω κανει το 1ο μερος και δεν ξερω πως να μετρησω τα σηματα και μου βγαζει λαθη Declaration Specifier
pinball_elf Δημοσ. 15 Απριλίου 2010 Δημοσ. 15 Απριλίου 2010 Σου γράφω και κάποιες απορίες μου υπο μορφή σχολίων στον παρακάτω κώδικα. > #include <unistd.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <stdio.h> #include <signal.h> int sigusr1_count = 0; void myfunc(int sig) { if (sig == SIGUSR1) { printf("ELAVA SHMA\n"); sigusr1_count++; } else if (sig == SIGALRM) { fprintf(stdout, "ELAVA %d SHMATA\n", sigusr1_count); exit(0); } } int main() { int x; int fd; fprintf(stdout, "plhktrologeiste enan arithmo:\n"); scanf("%d",&x); signal(SIGUSR1, myfunc); /* handle SIGUSR1 signal */ signal(SIGALRM, myfunc); /* handle SIGALRM signal */ alarm(2*x); /* generate a SIGALRM signal after 2*x seconds */ /* * Gia na ginei i epikoinonia me fifo to FIFO 8a prepei na proyparxei: * sto kelyfos: * $ mkfifo FIFO * h se kapoio allo programa: * fd = mkfifo ("<pathtofifo>/FIFO", O_RDWR | O_NONBLOCK); */ if ((fd = open("FIFO", O_RDWR | O_NONBLOCK)) == -1) { /* open FIFO */ fprintf(stderr, "Sender: fifo open failed.\n"); exit(3); } /* * * episis den katalava ti tha meteferetai mesw tou FIFO * */ for(; /* vroxos */ { /* * * ston vroxo episis den katalava ti 8a prepei na kanei to programma * */ } return 0; }
mchrisober Δημοσ. 15 Απριλίου 2010 Δημοσ. 15 Απριλίου 2010 φιλε μου σημαφορους δεν θες να υλοποιησεις? σε minix?
gio@ Δημοσ. 16 Απριλίου 2010 Μέλος Δημοσ. 16 Απριλίου 2010 Ευχαριστω για τη βοηθεια.κι εγω εχω μπερδευτει με το δευτερο προγραμμα αλλα νομιζω οτι θελει να κανουμε συνδεση με το πρωτο προγραμμα και οταν παταμε εντερ να στελνει σημα σε 3*χ δευτερολεπτα στο πρωτο κι ολα τα σηματα που δεχτηκε να τα τυπωνει ολα μαζι.ειναι μπερδεμα η ασκηση εχω πονοκεφαλιασει!!!
pinball_elf Δημοσ. 16 Απριλίου 2010 Δημοσ. 16 Απριλίου 2010 Για να στείλει το δεύτερο πρόγραμμα SIGUSR1 signals, πρέπει να καλεί την kill. H kill παίρνει δυο ορίσματα: το process id της διαδικασίας στη οποία θέλουμε να στείλουμε το σήμα και το σήμα(SIGUSR1). Άρα υποψιάζομαι ότι το πρώτο πρόγραμμα πρέπει να στέλνει το process id (το παιρνουμε απο την συνάρτηση getpid) του μέσω του FIFO. Επίσης το δεύτερο πρόγραμμα πρέπει να γνωρίζει και την τιμή του x που έδωσε ο χρήστης στο πρώτο πρόγραμμα. Τελικά μέσω του FIFO, το πρώτο πρόγραμμα θα στέλνει το process id του και την τιμη του x.
bokarinho Δημοσ. 17 Απριλίου 2010 Δημοσ. 17 Απριλίου 2010 Για να στείλει το δεύτερο πρόγραμμα SIGUSR1 signals, πρέπει να καλεί την kill. H kill παίρνει δυο ορίσματα: το process id της διαδικασίας στη οποία θέλουμε να στείλουμε το σήμα και το σήμα(SIGUSR1). Άρα υποψιάζομαι ότι το πρώτο πρόγραμμα πρέπει να στέλνει το process id (το παιρνουμε απο την συνάρτηση getpid) του μέσω του FIFO. Επίσης το δεύτερο πρόγραμμα πρέπει να γνωρίζει και την τιμή του x που έδωσε ο χρήστης στο πρώτο πρόγραμμα. Τελικά μέσω του FIFO, το πρώτο πρόγραμμα θα στέλνει το process id του και την τιμη του x. 'Εχω καιρό να ασχοληθώ με Unix Programming αλλά έχω την εντύπωση ότι εδώ πρέπει να καλέσεις της συνάρτηση signal ή ακόμα καλύτερα αν μάθεις να την χειρίζεσαι την sigaction συνάρτηση. Η δευτερή είναι ακόμα καλύτερη γιατί σε αφήνει να χειρίζεσαι περισσότερες πληροφορίες. Τώρα αν δεν μπορείς να βγάλεις άκρη θα σου δώσω και ένα παράδειγμα. Γενικά δεν χρειάζεσαι την kill ούτε την raise εδώ. Είναι απλά τα πράγματα.
kwsths946 Δημοσ. 14 Μαΐου 2011 Δημοσ. 14 Μαΐου 2011 γειά σας τυχαίνει να είμαι κι εγώ στην ίδια σχολή με τον gio και έχω ακριβώς την ίδια εκφώνηση μήπως κάποιος την έχει λύσει?
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.