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

Ασκηση c με σηματα


gio@

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

Δημοσ.

Να γραφούν δύο προγράμματα σε 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

Δημοσ.

Σου γράφω και κάποιες απορίες μου

υπο μορφή σχολίων στον παρακάτω κώδικα.

 

>
#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;
}

Δημοσ.

Ευχαριστω για τη βοηθεια.κι εγω εχω μπερδευτει με το δευτερο προγραμμα αλλα νομιζω οτι θελει να κανουμε συνδεση με το πρωτο προγραμμα και οταν παταμε εντερ να στελνει σημα σε 3*χ δευτερολεπτα στο πρωτο κι ολα τα σηματα που δεχτηκε να τα τυπωνει ολα μαζι.ειναι μπερδεμα η ασκηση εχω πονοκεφαλιασει!!!

Δημοσ.

Για να στείλει το δεύτερο πρόγραμμα SIGUSR1 signals, πρέπει να καλεί την kill. H kill παίρνει δυο ορίσματα: το process id της διαδικασίας στη οποία θέλουμε να στείλουμε το σήμα και το σήμα(SIGUSR1). Άρα υποψιάζομαι ότι το πρώτο πρόγραμμα πρέπει να στέλνει το process id (το παιρνουμε απο την συνάρτηση getpid) του μέσω του FIFO. Επίσης το δεύτερο πρόγραμμα πρέπει να γνωρίζει και την τιμή του x που έδωσε ο χρήστης στο πρώτο πρόγραμμα. Τελικά μέσω του FIFO, το πρώτο πρόγραμμα θα στέλνει το process id του και την τιμη του x.

Δημοσ.
Για να στείλει το δεύτερο πρόγραμμα SIGUSR1 signals, πρέπει να καλεί την kill. H kill παίρνει δυο ορίσματα: το process id της διαδικασίας στη οποία θέλουμε να στείλουμε το σήμα και το σήμα(SIGUSR1). Άρα υποψιάζομαι ότι το πρώτο πρόγραμμα πρέπει να στέλνει το process id (το παιρνουμε απο την συνάρτηση getpid) του μέσω του FIFO. Επίσης το δεύτερο πρόγραμμα πρέπει να γνωρίζει και την τιμή του x που έδωσε ο χρήστης στο πρώτο πρόγραμμα. Τελικά μέσω του FIFO, το πρώτο πρόγραμμα θα στέλνει το process id του και την τιμη του x.

 

'Εχω καιρό να ασχοληθώ με Unix Programming αλλά έχω την εντύπωση ότι εδώ πρέπει να καλέσεις της συνάρτηση signal ή ακόμα καλύτερα αν μάθεις να την χειρίζεσαι την sigaction συνάρτηση. Η δευτερή είναι ακόμα καλύτερη γιατί σε αφήνει να χειρίζεσαι περισσότερες πληροφορίες. Τώρα αν δεν μπορείς να βγάλεις άκρη θα σου δώσω και ένα παράδειγμα. Γενικά δεν χρειάζεσαι την kill ούτε την raise εδώ. Είναι απλά τα πράγματα.

  • 1 χρόνο αργότερα...
Δημοσ.

γειά σας

τυχαίνει να είμαι κι εγώ στην ίδια σχολή με τον gio και έχω ακριβώς την ίδια εκφώνηση

μήπως κάποιος την έχει λύσει?

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

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

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