manic Δημοσ. 30 Οκτωβρίου 2012 Δημοσ. 30 Οκτωβρίου 2012 Προσπαθω να φτιαξω εναν server σε c εχω κολλησει σε ενα σημειο ομως, πως μπορω μετα απο Χ millisec απο ενα προκαθορισμένο σημειο να καλώ αυτοματα μια συνάρτηση της επιλογης μου? Προφανώς θα το κανω με καποιο signal handler αλλα θελω εως ενα βαθμο να υπαρχει παραλληλία. ΠΧ: θα ξεκιναει η εκτελεση και θα φτανω στο σημειο Χ που θα δηλωνω οτι μετα απο 50millisec θελω η συναρτηση test να ξεκινήσει, θα συνεχίζει η εκτελεση κανονικα και μολις περασουν 50millisec θα κανει αλλαγη απο την κανονικη ροη εκτελεσης θα εκτελει την συαρτηση και μετα επιστρεφει. Μπορει κανεις να ριξει κανενα hint?? ευχαριστω
παπι Δημοσ. 30 Οκτωβρίου 2012 Δημοσ. 30 Οκτωβρίου 2012 Δεν εχει κατι τετοιο η c. Πρεπει να δεις το λειτουργικο. Αν ειναι win ειναι πανευκολο για nix, δεν ξερω αλλα δεν νομιζω να ειναι επιστημη
manic Δημοσ. 30 Οκτωβρίου 2012 Μέλος Δημοσ. 30 Οκτωβρίου 2012 @παπι Σε linux (Unix) πρεπει να τρεχει...
migf1 Δημοσ. 30 Οκτωβρίου 2012 Δημοσ. 30 Οκτωβρίου 2012 ... Προφανώς θα το κανω με καποιο signal handler αλλα θελω εως ενα βαθμο να υπαρχει παραλληλία. ... Δεν ξέρω αν είναι ακριβώς αυτό που ζητάς, αλλά ρίξε μια ματιά στην select(). Σου δίνει τη δυνατότητα να ξεμπλοκάρεις όταν υπάρξει i/o σε μια σειρά από file-descriptors (ή μέχρι να τελειώσει ο timer σου). Είναι όμως implementation dependent. EDIT: ... ΠΧ: θα ξεκιναει η εκτελεση και θα φτανω στο σημειο Χ που θα δηλωνω οτι μετα απο 50millisec θελω η συναρτηση test να ξεκινήσει, θα συνεχίζει η εκτελεση κανονικα και μολις περασουν 50millisec θα κανει αλλαγη απο την κανονικη ροη εκτελεσης θα εκτελει την συαρτηση και μετα επιστρεφει. ... Μπορει κανεις να ριξει κανενα hint?? ευχαριστω Χμ, άσχετη τελικά η select()... τώρα κατάλαβα τι θες να κάνεις. Οπότε δες τις: alarm() & settimer()
lion2486 Δημοσ. 30 Οκτωβρίου 2012 Δημοσ. 30 Οκτωβρίου 2012 μήπως κάποιο alert signal (που στέλνει ένα σήμα το λειτουργικό μετά από ένα καθορισμένο χρόνο...) (ή αλλιώς sleep και call?)
manic Δημοσ. 30 Οκτωβρίου 2012 Μέλος Δημοσ. 30 Οκτωβρίου 2012 ευχαριστω παρα πολυ για τις απαντησεις αλλα δεν βρηκα ακρη γιατι σε αυτην την συναρτηση που θα ενεργοποιείται θελω να περασω και αλλα ορισματα που με την χρηση των alert signals δεν γίνεται για την ιστορια τελικα το ελυσα με μια επιπλεον fork στην στιγμη που ηθελα αυτο το split στο προγραμμα μου το child process εκανα sleep και μετα exit
migf1 Δημοσ. 30 Οκτωβρίου 2012 Δημοσ. 30 Οκτωβρίου 2012 ευχαριστω πολυ για τις απαντησεις αλλα δεν βρηκα ακρη γιατι σε αυτην την συναρτηση που θα ενεργοποιείται θελω να περασω και αλλα ορισματα που με την χρηση των alert signals δεν γίνεται , σκέφτηκα να κανω το εξης: -> οταν φτασω στο σημείο που πρεπει σε x millisec να καλεσω την συναρτηση να κανω μια fork αυτη μεσα της θα εχει ενα usleep για x millisec μολις τελειωσει αυτο το usleep θα κανω αυτα που θελω και μετα θα κλεινω το process με ενα exit , ομως δεν μου δουλευει, βασικα με το που κανω exit κολαει και δεν συνεχιζει το προηγουμενο (parent) process ξερει κανεις γτ? Αν πω πως κατάλαβα, θα πω ψέμματα Βασικά τι πρόβλημα υπάρχει να περάσεις έξτρα ορίσματα στην συνάρτηση που θα ξυπνάει μετά από X msecs?
defacer Δημοσ. 30 Οκτωβρίου 2012 Δημοσ. 30 Οκτωβρίου 2012 για την ιστορια τελικα το ελυσα με μια επιπλεον fork στην στιγμη που ηθελα αυτο το split στο προγραμμα μου το child process εκανα sleep και μετα exit Άρα στο αρχικό σου post "έλεγες ψέματα" γιατί με την fork και αν δεν λάβεις συγκεκριμένα μέτρα δεν ισχύει το ότι σταματάει να εκτελείται ο "κανονικός" κώδικας όταν χτυπήσει ο timer. Don't do that. Για δικό σου καλό πρωτίστως.
migf1 Δημοσ. 30 Οκτωβρίου 2012 Δημοσ. 30 Οκτωβρίου 2012 Άρα στο αρχικό σου post "έλεγες ψέματα" γιατί με την fork και αν δεν λάβεις συγκεκριμένα μέτρα δεν ισχύει το ότι σταματάει να εκτελείται ο "κανονικός" κώδικας όταν χτυπήσει ο timer. ... Αυτό ακριβώς! Όταν κάνεις fork δημιουργείς νέο process, ενώ αρχικά έγραψες πως θες να κοιμήσεις για ένα διάστημα μια συνάρτηση του τρέχοντος process. Για αυτό σου έγραψα κι εγώ πως δεν κατάλαβα αυτό με το fork. Για την ιστορία, τι πρόβλημα έχεις στο να περάσεις έξτρα ορίσματα στην συνάρτηση που θα ξυπνάει στο τρέχον process με την λήξη του timer;
manic Δημοσ. 31 Οκτωβρίου 2012 Μέλος Δημοσ. 31 Οκτωβρίου 2012 Άρα στο αρχικό σου 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 μετα απο ενα σημειο να αλλαζει μαι τιμη ενος πινακα (σε κοινη μνημη παντα)
migf1 Δημοσ. 31 Οκτωβρίου 2012 Δημοσ. 31 Οκτωβρίου 2012 βασικα ηθελα η συναρτηση που θα ξυπναγε μετα απο χ 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 σου.
ipduh Δημοσ. 1 Νοεμβρίου 2012 Δημοσ. 1 Νοεμβρίου 2012 εάν θες κάτι γρήγορα και βρώμικα: > $ man nohup
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα