Hàm Sleep() trong ngôn ngữ C

Ham Sleep Trong Ngon Ngu C



Khi chúng tôi phát triển các chương trình yêu cầu sự tương tác của người dùng, có những trường hợp cần điều chỉnh thời gian của hệ thống để ứng dụng có thể đọc được và dễ sử dụng.

Ví dụ: nếu chúng tôi đang phát triển một ứng dụng bảng điều khiển trong đó chúng tôi cần thông báo cho người dùng về các tác vụ sẽ được thực hiện theo trình tự, thì các thông báo thông tin sẽ tồn tại trong một khoảng thời gian hợp lý để người dùng có thời gian đọc chúng trước khi chúng bị xóa và chương trình chuyển sang lệnh tiếp theo.

Trong bài viết Linuxhint này, bạn sẽ tìm hiểu cách sử dụng hàm sleep() để tạo độ trễ trong thời gian thực. Chúng tôi sẽ chỉ cho bạn cú pháp và mô tả của hàm này, cũng như các tùy chọn mà POSIX cung cấp để tạo độ trễ với phân số dưới một giây. Sau đó, bằng cách sử dụng các ví dụ, mã và hình ảnh thực tế, chúng tôi sẽ chỉ cho bạn cách trì hoãn việc thực hiện chương trình và ảnh hưởng của tín hiệu đến chức năng này.








Cú pháp hàm Sleep() trong ngôn ngữ C



chưa ký int ngủ ( chưa ký int giây )

Mô tả hàm Sleep() trong ngôn ngữ C

Hàm sleep() đặt tiến trình hoặc luồng ở chế độ ngủ trong thời gian tính bằng giây được chỉ định trong đối số đầu vào “giây”, là số nguyên không dấu. Khi hàm sleep() được gọi, quá trình gọi sẽ ngủ cho đến khi hết thời gian hoặc nhận được tín hiệu.



Hàm này thường được sử dụng để thực thi độ trễ dài hơn 1 giây khi thực hiện các quy trình thời gian thực. Đối với độ trễ dưới 1 giây, POSIX cung cấp hàm phân giải micro giây, usleep(), sử dụng lệnh gọi phương thức tương tự như sleep(). Đối với độ trễ dưới 1 micro giây, cũng có hàm nanosleep() với độ phân giải 1 nano giây, nhưng với một phương thức gọi khác trong đó hàm này sử dụng cấu trúc “timespec” làm đối số đầu vào để đặt thời gian trễ.





Nếu hàm sleep() đã sử dụng hết thời gian đã chỉ định thì kết quả là nó sẽ trả về 0. Nếu quá trình thực thi bị gián đoạn do tín hiệu đến trước khi hết thời gian đã chỉ định, nó sẽ trả về số giây còn lại cho đến thời điểm đó.

Hàm sleep() được xác định trong tiêu đề “unistd.h”. Để sử dụng nó, chúng ta cần đưa tệp này vào mã như sau:



#include

Cách giới thiệu độ trễ trong một quy trình bằng hàm Sleep()

Trong ví dụ này, chúng tôi tạo một bộ đếm thời gian bao gồm một vòng lặp vô hạn trong đó chúng tôi in thông báo “Thời gian đã trôi qua” trong bảng điều khiển lệnh, theo sau là các giây đã trôi qua của quy trình. Mỗi vòng lặp này được lặp lại cứ sau 2 giây do độ trễ do hàm sleep() gây ra.

Để thực hiện việc này, chúng tôi lấy một tệp trống có phần mở rộng “.c” và thêm tiêu đề “stdio.h” và “unistd.h” vào đó. Sau đó, chúng ta mở một hàm main() trống và xác định trong đó biến giây thuộc loại int mà chúng ta sẽ sử dụng làm bộ đếm thời gian đã trôi qua.

Khi các tiêu đề được chèn và biến được khai báo, chúng ta sẽ mở một vòng lặp vô hạn và sử dụng hàm printf() trong đó để hiển thị thông báo và giá trị thời gian. Ở dòng tiếp theo, chúng ta tăng biến thời gian lên 2 rồi gọi hàm sleep() với giá trị là 2 làm đối số đầu vào. Bằng cách này, chu trình này được lặp lại mỗi giây và chúng ta nhận được một bộ đếm hiển thị thời gian đã trôi qua trên màn hình. Bây giờ, chúng ta hãy xem mã của ứng dụng này. Hãy xem mã hoàn chỉnh cho ví dụ này:

#include
#include

trống rỗng chủ yếu ( )
{
int giây = 0 ;
trong khi ( 1 )
{
printf ( 'Thời gian đã trôi qua: %i \N ' , giây ) ;
giây += 2 ;
ngủ ( 2 ) ;
}

}

Trong phần sau, chúng ta sẽ thấy một hình ảnh về quá trình biên dịch và thực thi mã này. Như chúng ta có thể thấy, cứ sau 2 giây, chương trình sẽ in số giây đã trôi qua trên màn hình kể từ khi thực hiện quy trình.

Ảnh hưởng của tín hiệu đến hàm Sleep()

Trong ví dụ này, chúng ta muốn quan sát tác động của tín hiệu lên một quá trình được chuyển sang chế độ ngủ bằng cách sử dụng hàm sleep(). Để làm điều này, chúng ta tạo một ứng dụng đơn giản bao gồm hàm main() và bộ xử lý tín hiệu 36.

Trong dòng đầu tiên của hàm main(), chúng ta khai báo biến còn lại kiểu int nơi chúng ta lưu trữ giá trị được hàm sleep() trả về. Sau đó, chúng tôi sử dụng hàm signal() để liên kết trình xử lý với tín hiệu 36. Trên dòng tiếp theo, chúng tôi hiển thị PID của quy trình mà sau đó chúng tôi sử dụng để gửi tín hiệu từ lớp vỏ thứ hai đến quy trình. Cuối cùng, chúng ta gọi hàm sleep() và đặt đối số đầu vào của nó thành 60 giây, đủ lâu để gửi tín hiệu từ shell thứ hai. Chúng tôi gửi biến còn lại làm đối số đầu ra cho chế độ ngủ().

Trình xử lý được gắn với tín hiệu 36 bao gồm một dòng mã trong đó hàm printf() in thông báo “Thời gian còn lại:” theo sau là giá trị được trả về bởi hàm sleep() tại thời điểm tín hiệu đến quy trình. Ở đây, hãy xem mã cho ví dụ này.

#include
#include
#include
#include

trống rỗng người xử lý ( int còn lại ) ;

trống rỗng chủ yếu ( )
{
int còn lại ;
tín hiệu ( 36 , người xử lý ) ;
printf ( 'ID tiến trình: %i \N ' , cáu kỉnh ( ) ) ;
còn lại = ngủ ( 60 ) ;
}

trống rỗng người xử lý ( int còn lại )

{
printf ( 'Thời gian còn lại: %i \N ' , còn lại ) ;
}

Hình ảnh sau đây mà chúng ta thấy cho thấy quá trình biên dịch và thực thi mã này:

Để xem tác động của các tín hiệu trong quá trình này, chúng tôi biên dịch mã này và chạy nó. Sau đó, từ thiết bị đầu cuối thứ hai, chúng tôi gửi tín hiệu với cú pháp sau:

giết - tín hiệu n PID

Hình ảnh sau đây mà chúng ta thấy cho thấy việc thực thi mã trong bảng điều khiển trước và tác động của việc gửi tín hiệu từ bảng điều khiển sau. Như bạn có thể thấy, tín hiệu đã triệt tiêu tác dụng của hàm sleep() bằng cách đánh thức quá trình:

Phần kết luận

Trong bài viết Linuxhint này, chúng tôi đã hướng dẫn bạn cách sử dụng hàm sleep() để đặt một tiến trình ở chế độ ngủ trong một số giây được chỉ định. Chúng tôi cũng đã chỉ cho bạn cú pháp cũng như mô tả về hàm và phương thức gọi.

Sử dụng các ví dụ thực tế, đoạn mã và hình ảnh, chúng tôi đã chỉ cho bạn cách đặt một quy trình vào chế độ ngủ và những gì ảnh hưởng đến việc xuất hiện tín hiệu đối với quá trình ngủ bằng cách sử dụng hàm sleep().