manic Δημοσ. 10 Νοεμβρίου 2012 Δημοσ. 10 Νοεμβρίου 2012 Θέλω να εχω μια συνάρτηση που να κανει pause αλλα μόλις ακούσει ενα σήμα που θα στέλνει αλλη διεργασία να συνεχίσει την εκτέλεσή της. Κατελληξα στην χρηση της pause () αλλα βλεπω οτι ενεργοποιείται με SIGALRM το προβλημα ειναι οτι εχω ειδη χρησιμοιησει αυτο το σημα για αλλο λογο, υπαρχει τροπος να στελνω πχ. ενα SIGUSR1 αντι του SIGALRM και να (απεν-)ενεργοποιηθει η pause?
migf1 Δημοσ. 11 Νοεμβρίου 2012 Δημοσ. 11 Νοεμβρίου 2012 Καλημέρα, εκτός από πολύ συγκεκριμένες περιπτώσεις, η χρήση της pause() δεν είναι πολύ καλή ιδέα: http://www.gnu.org/software/libc/manual/html_node/Pause-Problems.html#Pause-Problems. Οπότε τσέκαρε αν όντως κάνει για την περίπτωσή σου. Από εκεί και πέρα γενικώς, όταν καλείται ένα signal handler τότε η default συμπεριφορά είναι να μπλοκάρεται αυτόματα το signal που έκανε trigger τον handler. Μπορείς όμως να αλλάξεις αυτή την default συμπεριφορά, ξεμπλοκάροντας το συγκεκριμένο signal μέσα στον handler, χρησιμοποιώντας την sigprocmask (ή με την psigprocmask αν είναι σε multi-threaded περιβάλλον)... αλλά σε αυτή την περίπτωση θα πρέπει να εξασφαλίσεις πως ο κώδικας του handler σου μπορεί να διαχειριστεί με ασφάλεια την υποδοχή ίδιων signals ασύγχρονα. Ρίξε μια ματιά στα παρακάτω: http://www.gnu.org/software/libc/manual/html_node/Signals-in-Handler.html#Signals-in-Handler http://www.gnu.org/software/libc/manual/html_node/Process-Signal-Mask.html#Process-Signal-Mask Σημείωσε επίσης πως αν θέλεις να στείλεις ένα signal στον εαυτό σου, μπορείς να το κάνεις γρήγορα με την raise() (αντί με την kill() ). ΥΓ. Επειδή πάει πολύς καιρός από όταν ασχολήθηκα με signals για τελευταία φορά, μια καλή πηγή πληροφόρησης είναι η τεκμηρίωση του gcc: http://www.gnu.org/software/libc/manual/html_node/Signal-Handling.html#Signal-Handling. Πιστεύω θα σε βοηθήσει αν αφιερώσεις χρόνο να την διαβάσεις πριν αρχίσεις να προγραμματίζεις με signals.
defacer Δημοσ. 11 Νοεμβρίου 2012 Δημοσ. 11 Νοεμβρίου 2012 Ίσως θα ήταν καλύτερα να μην το κάνεις με signal αλλά με semaphore/mutex πάνω στο οποίο θα κάνεις block μέχρι να γίνει signaled (sorry για την παρεμφερή ορολογία) από το άλλο process?
manic Δημοσ. 12 Νοεμβρίου 2012 Μέλος Δημοσ. 12 Νοεμβρίου 2012 Ίσως θα ήταν καλύτερα να μην το κάνεις με signal αλλά με semaphore/mutex πάνω στο οποίο θα κάνεις block μέχρι να γίνει signaled (sorry για την παρεμφερή ορολογία) από το άλλο process? κατι τετοιο οντως θα ηταν καλυτερο επειδη ομως δεν το εχω ξαναπροσπαθήσει υπαρχει κανενα παράδειγμά πως να το υλοποιήσω ευχαριστω
migf1 Δημοσ. 12 Νοεμβρίου 2012 Δημοσ. 12 Νοεμβρίου 2012 κατι τετοιο οντως θα ηταν καλυτερο επειδη ομως δεν το εχω ξαναπροσπαθήσει υπαρχει κανενα παράδειγμά πως να το υλοποιήσω ευχαριστω Αν χρησιμοποιείς decently C11 enabled compiler (π.χ. Pelles C σε πλατφόρμα των Windows) τότε αρκετά από αυτά έχουν στανταριστεί μέσω των <stdatomic.h> and <threads.h> Προσωπικά δεν τα έχω δοκιμάσει, αλλά αξίζει να το κοιτάξεις αν είναι να πάρεις αυτό το δρόμο
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα