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

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

Δημοσ.

Προσπαθω να φτιαξω εναν server σε c εχω κολλησει σε ενα σημειο ομως, πως μπορω μετα απο Χ millisec απο ενα προκαθορισμένο σημειο να καλώ αυτοματα μια συνάρτηση της επιλογης μου?

 

Προφανώς θα το κανω με καποιο signal handler αλλα θελω εως ενα βαθμο να υπαρχει παραλληλία.

 

ΠΧ:

 

θα ξεκιναει η εκτελεση και θα φτανω στο σημειο Χ που θα δηλωνω οτι μετα απο 50millisec θελω η συναρτηση test να ξεκινήσει, θα συνεχίζει η εκτελεση κανονικα και μολις περασουν 50millisec θα κανει αλλαγη απο την κανονικη ροη εκτελεσης θα εκτελει την συαρτηση και μετα επιστρεφει.

 

 

Μπορει κανεις να ριξει κανενα hint?? ευχαριστω

Δημοσ.

Δεν εχει κατι τετοιο η c. Πρεπει να δεις το λειτουργικο. Αν ειναι win ειναι πανευκολο για nix, δεν ξερω αλλα δεν νομιζω να ειναι επιστημη

Δημοσ.

...

Προφανώς θα το κανω με καποιο signal handler αλλα θελω εως ενα βαθμο να υπαρχει παραλληλία.

...

 

Δεν ξέρω αν είναι ακριβώς αυτό που ζητάς, αλλά ρίξε μια ματιά στην select().

 

Σου δίνει τη δυνατότητα να ξεμπλοκάρεις όταν υπάρξει i/o σε μια σειρά από file-descriptors (ή μέχρι να τελειώσει ο timer σου). Είναι όμως implementation dependent.

 

EDIT:

 

...

ΠΧ:

 

θα ξεκιναει η εκτελεση και θα φτανω στο σημειο Χ που θα δηλωνω οτι μετα απο 50millisec θελω η συναρτηση test να ξεκινήσει, θα συνεχίζει η εκτελεση κανονικα και μολις περασουν 50millisec θα κανει αλλαγη απο την κανονικη ροη εκτελεσης θα εκτελει την συαρτηση και μετα επιστρεφει.

...

 

Μπορει κανεις να ριξει κανενα hint?? ευχαριστω

 

Χμ, άσχετη τελικά η select()... τώρα κατάλαβα τι θες να κάνεις. Οπότε δες τις: alarm() & settimer()

Δημοσ.

μήπως κάποιο alert signal (που στέλνει ένα σήμα το λειτουργικό μετά από ένα καθορισμένο χρόνο...)

(ή αλλιώς sleep και call?)

Δημοσ.

ευχαριστω παρα πολυ για τις απαντησεις αλλα δεν βρηκα ακρη γιατι σε αυτην την συναρτηση που θα ενεργοποιείται θελω να περασω και αλλα ορισματα που με την χρηση των alert signals δεν γίνεται

 

για την ιστορια τελικα το ελυσα με μια επιπλεον fork στην στιγμη που ηθελα αυτο το split στο προγραμμα μου το child process εκανα sleep και μετα exit

Δημοσ.

ευχαριστω πολυ για τις απαντησεις αλλα δεν βρηκα ακρη γιατι σε αυτην την συναρτηση που θα ενεργοποιείται θελω να περασω και αλλα ορισματα που με την χρηση των alert signals δεν γίνεται , σκέφτηκα να κανω το εξης:

 

-> οταν φτασω στο σημείο που πρεπει σε x millisec να καλεσω την συναρτηση να κανω μια fork αυτη μεσα της θα εχει ενα usleep για x millisec μολις τελειωσει αυτο το usleep θα κανω αυτα που θελω και μετα θα κλεινω το process με ενα exit , ομως δεν μου δουλευει, βασικα με το που κανω exit κολαει και δεν συνεχιζει το προηγουμενο (parent) process ξερει κανεις γτ?

 

Αν πω πως κατάλαβα, θα πω ψέμματα :lol:

 

Βασικά τι πρόβλημα υπάρχει να περάσεις έξτρα ορίσματα στην συνάρτηση που θα ξυπνάει μετά από X msecs?

Δημοσ.

για την ιστορια τελικα το ελυσα με μια επιπλεον fork στην στιγμη που ηθελα αυτο το split στο προγραμμα μου το child process εκανα sleep και μετα exit

 

Άρα στο αρχικό σου post "έλεγες ψέματα" γιατί με την fork και αν δεν λάβεις συγκεκριμένα μέτρα δεν ισχύει το ότι σταματάει να εκτελείται ο "κανονικός" κώδικας όταν χτυπήσει ο timer.

 

Don't do that. Για δικό σου καλό πρωτίστως. :)

Δημοσ.

 

 

Άρα στο αρχικό σου post "έλεγες ψέματα" γιατί με την fork και αν δεν λάβεις συγκεκριμένα μέτρα δεν ισχύει το ότι σταματάει να εκτελείται ο "κανονικός" κώδικας όταν χτυπήσει ο timer.

 

...

 

Αυτό ακριβώς!

 

Όταν κάνεις fork δημιουργείς νέο process, ενώ αρχικά έγραψες πως θες να κοιμήσεις για ένα διάστημα μια συνάρτηση του τρέχοντος process. Για αυτό σου έγραψα κι εγώ πως δεν κατάλαβα αυτό με το fork.

 

Για την ιστορία, τι πρόβλημα έχεις στο να περάσεις έξτρα ορίσματα στην συνάρτηση που θα ξυπνάει στο τρέχον process με την λήξη του timer;

Δημοσ.

Άρα στο αρχικό σου post "έλεγες ψέματα" γιατί με την fork και αν δεν λάβεις συγκεκριμένα μέτρα δεν ισχύει το ότι σταματάει να εκτελείται ο "κανονικός" κώδικας όταν χτυπήσει ο timer.

 

Don't do that. Για δικό σου καλό πρωτίστως. :)

 

 

 

Αυτό ακριβώς!

 

Όταν κάνεις fork δημιουργείς νέο process, ενώ αρχικά έγραψες πως θες να κοιμήσεις για ένα διάστημα μια συνάρτηση του τρέχοντος process. Για αυτό σου έγραψα κι εγώ πως δεν κατάλαβα αυτό με το fork.

 

Για την ιστορία, τι πρόβλημα έχεις στο να περάσεις έξτρα ορίσματα στην συνάρτηση που θα ξυπνάει στο τρέχον process με την λήξη του timer;

 

βασικα ηθελα η συναρτηση που θα ξυπναγε μετα απο χ millisec να αλλαζει μια τιμη σε εναν πινακα τπτ αλλο, ομως επειδη ηταν shared memory αυτο που θα αλλαζε, επρεπε να περασω και ενα sem_t απο παραδειγματα που εψαχνα καταλαβα οτι η setitimer μπορουσε να καλεσε μια συναρτηση τετοιου στυλ

 

>
void alarm_wakeup (int i)
{
  signal(SIGALRM,alarm_wakeup);
  printf(" Wakeup!!!");
  exit(0);
}

 

χωρις δυνατοτητα να περασω αλλα ορισματα (Εκτος του i που δεν ξερω τι ειναι κι ολας) κυριος ειδα εδω παραδειγματα, μαλλον δεν το εθεσα σωστα δεν ηθελα ακριβως να σταματαει η κανονικη ροη του κωδικα αλλα σε χ millisec μετα απο ενα σημειο να αλλαζει μαι τιμη ενος πινακα (σε κοινη μνημη παντα)

Δημοσ.

 

βασικα ηθελα η συναρτηση που θα ξυπναγε μετα απο χ millisec να αλλαζει μια τιμη σε εναν πινακα τπτ αλλο, ομως επειδη ηταν shared memory αυτο που θα αλλαζε, επρεπε να περασω και ενα sem_t απο παραδειγματα που εψαχνα καταλαβα οτι η setitimer μπορουσε να καλεσε μια συναρτηση τετοιου στυλ

 

>
void alarm_wakeup (int i)
{
  signal(SIGALRM,alarm_wakeup);
  printf(" Wakeup!!!");
  exit(0);
}

 

χωρις δυνατοτητα να περασω αλλα ορισματα (Εκτος του i που δεν ξερω τι ειναι κι ολας) κυριος ειδα εδω παραδειγματα, μαλλον δεν το εθεσα σωστα δεν ηθελα ακριβως να σταματαει η κανονικη ροη του κωδικα αλλα σε χ millisec μετα απο ενα σημειο να αλλαζει μαι τιμη ενος πινακα (σε κοινη μνημη παντα)

 

Το i είναι το signal που θέλεις να διαχειριστεί ο handler σου (το απαιτεί το πρότυπο των callback συναρτήσεων στο 2ο όρισμα της signal() ... δηλαδή τον signal-handler που θα καλεστεί).

 

Στο link που σου έσωσα περιέχει links με πλήρη ανάλυση και sample κώδικα: π.χ.: http://www.gnu.org/software/libc/manual/html_node/Handler-Returns.html#Handler-Returns

 

Ένα άλλο παράδειγμα, είναι π.χ. αυτό: http://www.ccplusplus.com/2011/10/alarm-function-example-in-c.html

 

Πολύ πρόχειρα (οπότε μπορεί να κάνω λάθος) για το sem_t, θα μπορούσες είτε να το ορίσεις globally, είτε να το περνάς ως by-ref όρισμα σε μια custom συνάρτηση που θα καλούσε τον signal-handler του SIG_ALARM και θα διαχειριζόταν και το sem_t structure σου.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...