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

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

Δημοσ.

Θέλω να εχω μια συνάρτηση που να κανει pause αλλα μόλις ακούσει ενα σήμα που θα στέλνει αλλη διεργασία να συνεχίσει την εκτέλεσή της. Κατελληξα στην χρηση της pause () αλλα βλεπω οτι ενεργοποιείται με SIGALRM το προβλημα ειναι οτι εχω ειδη χρησιμοιησει αυτο το σημα για αλλο λογο, υπαρχει τροπος να στελνω πχ. ενα SIGUSR1 αντι του SIGALRM και να (απεν-)ενεργοποιηθει η pause?

Δημοσ.

Καλημέρα,

 

εκτός από πολύ συγκεκριμένες περιπτώσεις, η χρήση της 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.

Δημοσ.

Ίσως θα ήταν καλύτερα να μην το κάνεις με signal αλλά με semaphore/mutex πάνω στο οποίο θα κάνεις block μέχρι να γίνει signaled (sorry για την παρεμφερή ορολογία) από το άλλο process?

Δημοσ.

Ίσως θα ήταν καλύτερα να μην το κάνεις με signal αλλά με semaphore/mutex πάνω στο οποίο θα κάνεις block μέχρι να γίνει signaled (sorry για την παρεμφερή ορολογία) από το άλλο process?

 

κατι τετοιο οντως θα ηταν καλυτερο επειδη ομως δεν το εχω ξαναπροσπαθήσει υπαρχει κανενα παράδειγμά πως να το υλοποιήσω ευχαριστω

Δημοσ.

κατι τετοιο οντως θα ηταν καλυτερο επειδη ομως δεν το εχω ξαναπροσπαθήσει υπαρχει κανενα παράδειγμά πως να το υλοποιήσω ευχαριστω

 

Αν χρησιμοποιείς decently C11 enabled compiler (π.χ. Pelles C σε πλατφόρμα των Windows) τότε αρκετά από αυτά έχουν στανταριστεί μέσω των <stdatomic.h> and <threads.h>

 

Προσωπικά δεν τα έχω δοκιμάσει, αλλά αξίζει να το κοιτάξεις αν είναι να πάρεις αυτό το δρόμο ;)

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

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

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

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

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

Σύνδεση

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

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