Λειτουργία Sleep() σε Γλώσσα C

Leitourgia Sleep Se Glossa C



Όταν αναπτύσσουμε προγράμματα που απαιτούν αλληλεπίδραση με τον χρήστη, υπάρχουν περιπτώσεις όπου είναι απαραίτητο να προσαρμόσουμε τους χρόνους του συστήματος έτσι ώστε η εφαρμογή να είναι ευανάγνωστη και εύκολη στη χρήση.

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

Σε αυτό το άρθρο του Linuxhint, θα μάθετε πώς να χρησιμοποιείτε τη συνάρτηση sleep() για να δημιουργείτε καθυστερήσεις σε πραγματικό χρόνο. Θα σας δείξουμε τη σύνταξη και την περιγραφή αυτής της συνάρτησης, καθώς και τις επιλογές που παρέχει το POSIX για τη δημιουργία καθυστερήσεων με κλάσματα μικρότερα του δευτερολέπτου. Στη συνέχεια, χρησιμοποιώντας πρακτικά παραδείγματα, κωδικούς και εικόνες, θα σας δείξουμε πώς να καθυστερήσετε την εκτέλεση ενός προγράμματος και τις επιπτώσεις των σημάτων σε αυτήν τη λειτουργία.








Σύνταξη της συνάρτησης Sleep() στη γλώσσα C



ανυπόγραφο ενθ ύπνος ( ανυπόγραφο ενθ δευτ )

Περιγραφή της συνάρτησης Sleep() στη γλώσσα C

Η συνάρτηση sleep() θέτει τη διεργασία ή το νήμα σε αδράνεια για το χρόνο σε δευτερόλεπτα που καθορίζεται στο όρισμα εισαγωγής «sec» που είναι ένας ακέραιος χωρίς υπογραφή. Μόλις κληθεί η συνάρτηση sleep(), η διαδικασία κλήσης αδράνει μέχρι να λήξει το χρονικό όριο ή να λάβει ένα σήμα.



Αυτή η συνάρτηση χρησιμοποιείται συχνά για την επιβολή μεγάλων καθυστερήσεων άνω του 1 δευτερολέπτου στην εκτέλεση διαδικασιών σε πραγματικό χρόνο. Για καθυστερήσεις μικρότερες από 1 δευτερόλεπτο, το POSIX παρέχει τη συνάρτηση ανάλυσης μικροδευτερόλεπτου, usleep(), η οποία χρησιμοποιεί την ίδια μέθοδο κλήσης με την sleep(). Για καθυστερήσεις μικρότερες από 1 μικροδευτερόλεπτο, υπάρχει επίσης η συνάρτηση nanosleep() με ανάλυση 1 νανοδευτερόλεπτο, αλλά με διαφορετική μέθοδο κλήσης όπου χρησιμοποιεί τις δομές 'timespec' ως ορίσματα εισόδου για να ορίσει τον χρόνο καθυστέρησης.





Εάν η συνάρτηση sleep() έχει καταναλώσει όλο τον καθορισμένο χρόνο, επιστρέφει 0 ως αποτέλεσμα. Εάν η εκτέλεση διακοπεί από την άφιξη ενός σήματος πριν παρέλθει ο καθορισμένος χρόνος, επιστρέφει τον αριθμό των δευτερολέπτων που απομένει μέχρι εκείνη τη στιγμή.

Η συνάρτηση sleep() ορίζεται στην κεφαλίδα 'unistd.h'. Για να το χρησιμοποιήσουμε, πρέπει να συμπεριλάβουμε αυτό το αρχείο στον κώδικα ως εξής:



#include

Πώς να εισάγετε καθυστερήσεις σε μια διαδικασία με τη συνάρτηση Sleep().

Σε αυτό το παράδειγμα, δημιουργούμε ένα χρονόμετρο που αποτελείται από έναν άπειρο βρόχο στον οποίο εκτυπώνουμε το μήνυμα 'Elapsed time' στην κονσόλα εντολών, ακολουθούμενο από τα δευτερόλεπτα που έχουν περάσει από τη διαδικασία. Κάθε ένας από αυτούς τους βρόχους επαναλαμβάνεται κάθε 2 δευτερόλεπτα λόγω της καθυστέρησης που προκαλείται από τη συνάρτηση sleep().

Για να το κάνουμε αυτό, παίρνουμε ένα κενό αρχείο με την επέκταση “.c” και προσθέτουμε τις κεφαλίδες “stdio.h” και “unistd.h” σε αυτό. Στη συνέχεια, ανοίγουμε μια κενή συνάρτηση main() και ορίζουμε σε αυτήν τη μεταβλητή δευτερόλεπτα τύπου int την οποία θα χρησιμοποιήσουμε ως μετρητή για το χρόνο που έχει παρέλθει.

Μόλις εισαχθούν οι κεφαλίδες και δηλωθεί η μεταβλητή, ανοίγουμε έναν άπειρο βρόχο και χρησιμοποιούμε τη συνάρτηση printf() σε αυτόν για να εμφανίσουμε το μήνυμα και την τιμή χρόνου. Στην επόμενη γραμμή, αυξάνουμε τη μεταβλητή χρόνου κατά 2 και στη συνέχεια καλούμε τη συνάρτηση sleep() με την τιμή 2 ως όρισμα εισόδου. Με αυτόν τον τρόπο, αυτός ο κύκλος επαναλαμβάνεται κάθε δευτερόλεπτο και παίρνουμε έναν μετρητή που εμφανίζει τον χρόνο που έχει περάσει στην οθόνη. Τώρα, ας ρίξουμε μια ματιά στον κώδικα για αυτήν την εφαρμογή. Ας δούμε τον πλήρη κώδικα για αυτό το παράδειγμα:

#include
#include

κενός κύριος ( )
{
ενθ δευτερόλεπτα = 0 ;
ενώ ( 1 )
{
printf ( 'Χρόνος που πέρασε: %i \n ' , δευτερόλεπτα ) ;
δευτερόλεπτα += 2 ;
ύπνος ( 2 ) ;
}

}

Στη συνέχεια, θα δούμε μια εικόνα με τη μεταγλώττιση και την εκτέλεση αυτού του κώδικα. Όπως βλέπουμε, κάθε 2 δευτερόλεπτα, το πρόγραμμα εκτυπώνει στην οθόνη τα δευτερόλεπτα που έχουν περάσει από την εκτέλεση της διαδικασίας.

Επίδραση των σημάτων στη συνάρτηση Sleep().

Σε αυτό το παράδειγμα, θέλουμε να παρατηρήσουμε την επίδραση των σημάτων σε μια διαδικασία που τίθεται σε αδράνεια χρησιμοποιώντας τη συνάρτηση sleep(). Για να γίνει αυτό, δημιουργούμε μια απλή εφαρμογή που αποτελείται από μια συνάρτηση main() και έναν χειριστή για το σήμα 36.

Στην πρώτη γραμμή της συνάρτησης main(), δηλώνουμε την υπόλοιπη μεταβλητή τύπου int όπου αποθηκεύουμε την τιμή που επιστρέφεται από τη συνάρτηση sleep(). Στη συνέχεια, χρησιμοποιούμε τη συνάρτηση signal() για να δεσμεύσουμε τον χειριστή στο σήμα 36. Στην επόμενη γραμμή, εμφανίζουμε το PID της διεργασίας το οποίο στη συνέχεια χρησιμοποιούμε για να στείλουμε ένα σήμα από ένα δεύτερο κέλυφος στη διεργασία. Τέλος, καλούμε τη συνάρτηση sleep() και ορίζουμε το όρισμα εισόδου της στα 60 δευτερόλεπτα, αρκετά για να στείλουμε ένα σήμα από ένα δεύτερο φλοιό. Στέλνουμε την υπόλοιπη μεταβλητή ως όρισμα εξόδου στο sleep().

Ο χειριστής που είναι προσαρτημένος στο σήμα 36 αποτελείται από μια γραμμή κώδικα όπου η συνάρτηση printf() εκτυπώνει το μήνυμα 'Χρόνος που απομένει:' ακολουθούμενο από την τιμή που επιστρέφεται από το sleep() τη στιγμή που το σήμα φτάνει στη διεργασία. Εδώ, ας δούμε τον κώδικα για αυτό το παράδειγμα.

#include
#include
#include
#include

κενός χειριστής ( ενθ παραμένων ) ;

κενός κύριος ( )
{
ενθ παραμένων ;
σήμα ( 36 , χειριστής ) ;
printf ( 'Αναγνωριστικό διαδικασίας: %i \n ' , ζαλισμένος ( ) ) ;
παραμένων = ύπνος ( 60 ) ;
}

κενός χειριστής ( ενθ παραμένων )

{
printf ( 'Χρόνος που απομένει: %i \n ' , παραμένων ) ;
}

Η παρακάτω εικόνα που βλέπουμε δείχνει τη μεταγλώττιση και την εκτέλεση αυτού του κώδικα:

Για να δούμε την επίδραση των σημάτων σε αυτή τη διαδικασία, μεταγλωττίζουμε αυτόν τον κώδικα και τον εκτελούμε. Στη συνέχεια, από ένα δεύτερο τερματικό, στέλνουμε ένα σήμα με την ακόλουθη σύνταξη:

σκοτώνω - n PID σήματος

Η παρακάτω εικόνα που βλέπουμε δείχνει την εκτέλεση του κώδικα στην προηγούμενη κονσόλα και τα αποτελέσματα της άφιξης ενός σήματος που αποστέλλεται από την επόμενη κονσόλα. Όπως μπορείτε να δείτε, το σήμα έχει καταστείλει την επίδραση της λειτουργίας sleep() ξυπνώντας τη διαδικασία:

συμπέρασμα

Σε αυτό το άρθρο του Linuxhint, σας δείξαμε πώς να χρησιμοποιήσετε τη συνάρτηση sleep() για να θέσετε μια διεργασία σε αδράνεια για έναν καθορισμένο αριθμό δευτερολέπτων. Σας δείξαμε επίσης τη σύνταξη καθώς και την περιγραφή της συνάρτησης και τη μέθοδο κλήσης.

Χρησιμοποιώντας πρακτικά παραδείγματα, αποσπάσματα κώδικα και εικόνες, σας δείξαμε πώς να θέσετε μια διαδικασία σε κατάσταση αναστολής λειτουργίας και τι επηρεάζει την άφιξη ενός σήματος σε μια διαδικασία ύπνου χρησιμοποιώντας τη συνάρτηση sleep().