TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀNTHÔNG VIỆT – HÀN KHOA KHOA HỌC MÁY TÍNH BÁO CÁO Học phần: Lập trình hệ thống Đồ án: Chương trình C minh họa quá trình tạm dừng và tiếp tục sử
GIỚI THIỆU
Tổng quan đồ án
- Xây dựng chương trình C minh họa quá trình tạm dừng và tiếp tục sử dụng tín hiệu.
1.1.2 Lý do chọn đồ án
Học về xử lý tín hiệu trong ngôn ngữ lập trình C là một chủ đề quan trọng giúp người học nắm vững cách quản lý và tương tác giữa các tiến trình trong hệ thống Đồ án này không chỉ cung cấp kiến thức lý thuyết mà còn giúp sinh viên áp dụng thực tiễn, từ đó nâng cao khả năng xử lý tín hiệu hiệu quả trong các ứng dụng lập trình.
Để tạm dừng và tiếp tục một tiến trình, việc hiểu rõ về tiến trình và quản lý tiến trình là rất quan trọng Kiến thức về cách thức hoạt động của tiến trình và sự tương tác giữa chúng đóng vai trò then chốt trong lập trình hệ thống.
Chức năng tạm dừng và tiếp tục tiến trình đóng vai trò quan trọng trong việc quản lý tài nguyên hệ thống, giúp đảm bảo tính ổn định cho các ứng dụng Việc xây dựng chương trình minh họa sẽ giúp bạn hiểu rõ hơn về tác dụng thực tế của chức năng này.
Nâng cao kỹ năng lập trình C của bạn thông qua việc xây dựng một chương trình minh họa, bao gồm các khía cạnh như xử lý tín hiệu và quản lý tiến trình.
Chọn đồ án này không chỉ giúp phát triển khả năng debugging và gỡ lỗi, mà còn mang đến cơ hội khám phá những vấn đề thú vị và phức tạp liên quan đến tín hiệu.
Sử dụng tín hiệu là yếu tố quan trọng trong quản lý tiến trình hệ thống, góp phần đảm bảo sự ổn định và hiệu quả cho các ứng dụng Chương trình này giúp bạn nắm vững cách sử dụng tín hiệu để kiểm soát tiến trình và phát triển ứng dụng ổn định trên môi trường Linux.
Bài viết này sẽ giới thiệu cơ bản về tín hiệu trong lập trình hệ thống, kèm theo những ví dụ cụ thể để minh họa cách sử dụng tín hiệu nhằm tạm dừng và tiếp tục các tiến trình Hy vọng rằng nội dung này sẽ giúp bạn hiểu rõ hơn về việc áp dụng tín hiệu trong lập trình.
1.1.3 Nội dung cần thực hiện
Chương trình C mà bạn cung cấp là một ví dụ điển hình về việc sử dụng tín hiệu để tạm dừng và tiếp tục quá trình thực hiện Mục tiêu chính của chương trình này là minh họa cách thức hoạt động của tín hiệu trong việc kiểm soát luồng thực thi của ứng dụng.
Sử dụng tín hiệu SIGTSTP (Ctrl+Z) để tạm dừng và tiếp tục chương trình.
Sử dụng tín hiệu SIGINT (Ctrl+C) để kết thúc chương trình.
Sử dụng tín hiệu SIGALRM để tạo thông báo định kỳ và quản lý thời gian.
- Dưới đây là mô tả chi tiết về cách chương trình thực hiện việc tạm dừng và tiếp tục:
Chương trình khởi đầu bằng việc đăng ký xử lý tín hiệu SIGTSTP (Ctrl+Z) và SIGINT (Ctrl+C) thông qua hàm signal() Đồng thời, nó cũng thiết lập hàm xử lý tín hiệu SIGALRM để gửi thông báo định kỳ và quản lý thời gian hiệu quả.
Chương trình chạy trong một vòng lặp chính với biến should_continue kiểm soát việc tiếp tục thực hiện hoặc kết thúc chương trình.
Khi tín hiệu SIGALRM được kích hoạt bởi hàm alarm(), hàm sig_alarm() sẽ được gọi để cập nhật trạng thái chương trình Hàm này cũng hiển thị thông báo phù hợp với trạng thái hiện tại của chương trình.
Khi tín hiệu SIGTSTP (Ctrl+Z) được gửi, hàm handle_SIGTSTP() sẽ được kích hoạt Hàm này có nhiệm vụ kiểm tra trạng thái của chương trình và quyết định tạm dừng hoặc tiếp tục chương trình dựa trên tình huống hiện tại.
Khi tín hiệu SIGINT (Ctrl+C) được gửi, hàm handle_SIGINT() sẽ được kích hoạt Hàm này kiểm tra trạng thái của chương trình, tạm dừng nếu chương trình đang chạy hoặc kết thúc nếu nó đang ở trạng thái tạm dừng.
Chương trình cung cấp bảng theo dõi trạng thái và tín hiệu, cho phép người dùng tương tác thông qua các chức năng tạm dừng, tiếp tục hoặc kết thúc Điều này minh họa việc sử dụng tín hiệu để kiểm soát quá trình chạy của ứng dụng, đồng thời tạo ra một giao diện thân thiện với người dùng.
Cấu trúc báo cáo
- Đồ án gồm 4 phần chính:
Chương 1: Giới thiệu: giới thiệu tổng quan về đồ án, phương pháp thực hiện và mục tiêu của đồ án.
Chương 2: Nghiên cứu tổng quan: trình bày kiến thức tổng quan về các công nghệ được sử dụng để xây dựng chương trình
Chương 3: Xây dựng chương trình
NGHIÊN CỨU TỔNG QUAN
Công cụ và hệ điều hành hỗ trợ
- Công cụ được sử dụng để xây dựng chương trình là Oracle VM vitualBox
Hình 1 Oracle VM VitualBox là gì?
Oracle VM VirtualBox là phần mềm ảo hóa miễn phí và mã nguồn mở, giúp người dùng tạo và quản lý máy ảo trên máy tính Trong lĩnh vực lập trình hệ thống và phát triển ứng dụng, Oracle VM VirtualBox mang lại nhiều lợi ích quan trọng.
Oracle VM VirtualBox cho phép phát triển và kiểm tra ứng dụng đa nền tảng bằng cách tạo các máy ảo với các hệ điều hành khác nhau như Linux, Windows và macOS trên cùng một máy tính vật lý Điều này giúp tiết kiệm thời gian và tài nguyên, vì bạn không cần phải cài đặt các hệ điều hành thực tế trên nhiều máy tính khác nhau.
Môi trường kiểm tra an toàn là việc tạo ra các máy ảo cô lập, cho phép bạn kiểm tra ứng dụng hoặc phần mềm độc hại mà không làm ảnh hưởng đến máy tính chính Phương pháp này giúp bảo vệ máy tính và dữ liệu của bạn khỏi các rủi ro tiềm ẩn.
VirtualBox cho phép tạo ra các máy ảo độc lập với cấu hình tùy chỉnh, bao gồm việc phân bổ tài nguyên như CPU, RAM và bộ nhớ ổ cứng Điều này tạo điều kiện cho việc thiết lập một môi trường phát triển tiêu chuẩn, giúp đảm bảo tính đồng nhất trong quá trình làm việc của các thành viên trong nhóm.
Để đảm bảo sẵn sàng và khôi phục nhanh chóng, bạn nên tạo bản sao lưu cho máy ảo và thiết lập các điểm dừng (snapshot) Điều này giúp bạn phục hồi dữ liệu hiệu quả trong trường hợp xảy ra sự cố.
2.1.2 Hệ điều hành hỗ trợ
- Hệ điều hành được sử dụng để xây dựng chương trình là Ubuntu
Ubuntu là hệ điều hành máy tính dựa trên Debian GNU/Linux, mang triết lý "tình yêu con người" từ tiếng Zulu, nhấn mạnh tầm quan trọng của cộng đồng Hệ điều hành này nhằm cung cấp sự ổn định, dễ sử dụng và dễ cài đặt cho người dùng thông thường Được công nhận là bản phân phối Linux tốt nhất cho máy tính để bàn, Ubuntu chiếm khoảng 30% thị phần các bản phân phối Linux trên máy tính để bàn vào năm 2007.
Ubuntu là phần mềm mã nguồn mở và miễn phí, cho phép người dùng tự do chạy, sao chép, phân phối, nghiên cứu, thay đổi và cải tiến theo giấy phép GNU GPL Được tài trợ bởi Canonical Ltd, do Mark Shuttleworth, một doanh nhân người Nam Phi, làm chủ, Ubuntu không được bán mà Canonical thu lợi từ việc cung cấp hỗ trợ kỹ thuật Nhờ vào mô hình mã nguồn mở, Canonical có thể tận dụng tài năng của các nhà phát triển bên ngoài để cải tiến các thành phần của Ubuntu mà không cần tự phát triển hoàn toàn.
Bản phát hành đầu tiên của Ubuntu diễn ra vào ngày 20 tháng 10 năm 2004, với mục tiêu tạo ra một nhánh tạm thời từ dự án Debian Linux Điều này cho phép Ubuntu phát hành phiên bản mới mỗi 6 tháng, mang đến một hệ điều hành thường xuyên được cập nhật Các bản phát hành của Ubuntu luôn tích hợp phiên bản mới nhất của Gnome, dự kiến phát hành sau Gnome khoảng một tháng Khác với các nhánh Debian trước đây như MEPIS hay Xandros, Ubuntu tuân theo triết lý của Debian, tập trung vào việc sử dụng phần mềm miễn phí (libre) mà không dựa vào phần mềm bổ sung để tạo ra mô hình kinh doanh.
Hình 2 Giao diện Ubuntu trông như thế nào
- Dưới đây là một số điểm quan trọng về Ubuntu:
Ubuntu là một hệ điều hành mã nguồn mở, cho phép cộng đồng phát triển truy cập vào mã nguồn để phát triển và sửa lỗi.
Ubuntu sở hữu nhiều biến thể giao diện người dùng, với GNOME là môi trường giao diện mặc định cho phiên bản chính thức Bên cạnh đó, người dùng còn có thể lựa chọn các biến thể khác như Kubuntu, sử dụng KDE, và Xubuntu, sử dụng Xfce, cùng nhiều tùy chọn khác.
The Ubuntu Software Center, or GNOME Software, serves as a user-friendly platform for effortlessly searching and installing applications and software from the Ubuntu repository.
Ubuntu sở hữu một cộng đồng đông đảo và phong phú với nhiều tài liệu trực tuyến Người dùng có thể dễ dàng tìm kiếm thông tin, đặt câu hỏi và nhận được sự hỗ trợ từ các thành viên trong cộng đồng.
Ubuntu cung cấp các phiên bản LTS (Long Term Support) với thời gian hỗ trợ kéo dài từ 5 đến 10 năm, giúp doanh nghiệp và tổ chức triển khai và duy trì hệ điều hành một cách ổn định trong thời gian dài.
Ubuntu là một hệ điều hành phổ biến, được sử dụng rộng rãi trên máy tính để bàn, máy chủ và trong các môi trường đám mây, phục vụ cho cả người dùng cá nhân và doanh nghiệp.
Tìm hiểu về các công nghệ cần sử dụng
- Ngôn ngữ lập trình C là một trong những ngôn ngữ lập trình cơ bản và quan trọng trong lĩnh vực lập trình hệ thống
Hình 3 Ngôn ngữ C là gì
Ngôn ngữ C được phát triển bởi Dennis Ritchie tại Bell Labs vào những năm 1970, ban đầu nhằm mục đích viết hệ điều hành UNIX Ngày nay, C đã trở thành một trong những ngôn ngữ lập trình phổ biến nhất trong lĩnh vực lập trình hệ thống và nhúng.
Ngôn ngữ lập trình C mang tính chất mã nguồn mở, cho phép mọi người truy cập và chỉnh sửa mã nguồn dễ dàng Điều này đã thúc đẩy sự phát triển của một cộng đồng lập trình viên năng động và tạo ra nhiều thư viện mã nguồn mở phong phú dành cho ngôn ngữ C.
Ngôn ngữ C nổi bật với hiệu năng cao và khả năng kiểm soát tối ưu, khiến nó trở thành lựa chọn lý tưởng cho việc phát triển các ứng dụng yêu cầu hiệu suất mạnh mẽ, như hệ điều hành, trình điều khiển và phần mềm nhúng.
Chương trình viết bằng C có tính di động cao, cho phép chạy trên nhiều nền tảng khác nhau mà không cần thay đổi mã nguồn Điều này khiến C trở thành một công cụ mạnh mẽ trong phát triển phần mềm đa nền tảng.
Ngôn ngữ lập trình C cho phép phát triển các hệ thống lớn và phức tạp, đóng vai trò quan trọng trong việc xây dựng nhiều hệ điều hành nổi tiếng như Linux, Windows và macOS.
Tiêu chuẩn: Có một tiêu chuẩn chung cho ngôn ngữ C, gọi là "ANSI C" hoặc
"ISO C." Điều này đảm bảo tính di động và tương thích giữa các trình biên dịch và nền tảng khác nhau.
Thư viện mã nguồn mở phong phú và tiêu chuẩn cho ngôn ngữ C giúp lập trình viên phát triển ứng dụng một cách nhanh chóng và hiệu quả.
Ngôn ngữ C là một trong những ngôn ngữ lập trình phổ biến nhất, thường được sử dụng để phát triển hệ điều hành, trình điều khiển thiết bị và ứng dụng nhúng Với khả năng kiểm soát cao đối với phần cứng và tài nguyên hệ thống, C mang lại hiệu quả tối ưu cho các phần mềm nền tảng và nhiều lĩnh vực lập trình hệ thống khác.
2.2.2 Ưu điểm và nhược điểm của C
Ngôn ngữ lập trình C được tối ưu hóa để hoạt động gần gũi với phần cứng, giúp sử dụng tài nguyên máy tính một cách hiệu quả Nhờ vào quản lý bộ nhớ thủ công và khả năng truy cập trực tiếp vào phần cứng, lập trình viên có thể tối ưu hóa hiệu suất ứng dụng một cách linh hoạt.
Chương trình C có khả năng chạy trên nhiều nền tảng khác nhau mà không cần thay đổi mã nguồn, điều này khiến C trở thành lựa chọn lý tưởng cho việc phát triển ứng dụng đa nền tảng.
Kiểm soát cấp thấp cho phép tối ưu hóa khả năng kiểm soát phần cứng và tài nguyên hệ thống, điều này đặc biệt quan trọng trong việc phát triển hệ thống nhúng và hệ điều hành.
Mã nguồn mở và thư viện phong phú cho C giúp lập trình viên tiết kiệm thời gian và công sức trong việc phát triển ứng dụng, nhờ vào sự đa dạng của các thư viện tiêu chuẩn có sẵn.
Hệ thống lớn: Có thể sử dụng C để phát triển hệ thống lớn và phức tạp như hệ điều hành và các phần mềm nhúng.
Việc phát triển ứng dụng đơn giản có thể trở nên phức tạp hơn khi sử dụng một số ngôn ngữ lập trình, vì có thể cần nhiều dòng mã hơn để thực hiện các tác vụ cơ bản Điều này dẫn đến việc mã nguồn trở nên phức tạp hơn, ngay cả với những ứng dụng có tính năng đơn giản.
Quản lý bộ nhớ trong ngôn ngữ C yêu cầu bạn thực hiện thủ công, bao gồm cả việc phân bổ và giải phóng bộ nhớ Việc này có thể gây ra các lỗi nghiêm trọng như rò rỉ bộ nhớ và lỗi trỏ, ảnh hưởng đến hiệu suất và độ ổn định của chương trình.
C ngừng cung cấp cơ chế bảo mật tích hợp, dẫn đến những khó khăn trong việc bảo mật cho các ứng dụng lớn và phức tạp Việc quản lý bảo mật trở nên phức tạp hơn, yêu cầu các nhà phát triển phải chú trọng hơn đến các biện pháp bảo vệ dữ liệu và an toàn thông tin.
C có khả năng hạn chế trong việc xử lý chuỗi và văn bản, vì nó không cung cấp nhiều tính năng tích hợp cho các tác vụ này Điều này có thể khiến việc làm việc với dữ liệu văn bản trở nên phức tạp hơn so với một số ngôn ngữ lập trình khác.
Tìm hiểu về các tín hiệu
Tín hiệu SIGINT (Signal Interrupt) là một tín hiệu quan trọng trong hệ điều hành Linux và các hệ thống Unix, thường được kích hoạt bằng phím tắt Ctrl+C trong terminal hoặc thông qua lệnh kill.
Tín hiệu SIGINT có chức năng chính là yêu cầu một tiến trình đang thực thi dừng lại hoặc chấm dứt hoạt động Khi nhận được tín hiệu này, tiến trình thường sẽ dừng lại và thoát khỏi chế độ thực thi, từ đó trả lại quyền điều khiển cho terminal hoặc người dùng.
- Đây là một số điểm quan trọng về tín hiệu SIGINT:
Tổ hợp phím Ctrl + C thường được người dùng sử dụng trong terminal để gửi tín hiệu SIGINT đến tiến trình đang chạy, giúp dừng hoặc yêu cầu chương trình kết thúc một cách an toàn.
Khi một tiến trình nhận tín hiệu SIGINT, nó sẽ thực hiện quy trình chấm dứt thông thường, cho phép hoàn tất các công việc còn lại và ghi dữ liệu nếu cần thiết, trước khi tiến trình kết thúc.
Trong ngôn ngữ lập trình C trên Linux, bạn có thể xử lý tín hiệu SIGINT bằng cách sử dụng hàm signal() hoặc sigaction() để đăng ký một hàm xử lý tín hiệu tùy chỉnh Việc này cho phép bạn xác định hành động cụ thể mà tiến trình sẽ thực hiện khi nhận tín hiệu SIGINT.
Sử dụng tín hiệu SIGINT trong quản lý tiến trình trên hệ điều hành Linux là rất quan trọng để đảm bảo an toàn Tín hiệu này giúp các tiến trình kết thúc một cách an toàn, ngăn chặn việc xảy ra các tình huống bất thường.
Tín hiệu SIGINT đóng vai trò quan trọng trong việc tương tác với các tiến trình, giúp đảm bảo rằng chương trình hoặc tiến trình có thể được kết thúc một cách sạch sẽ khi người dùng yêu cầu.
Tín hiệu SIGTSTP (Signal Terminal Stop) là một tín hiệu quan trọng trong hệ điều hành Linux, thường được kích hoạt bằng phím tắt Ctrl+Z Chức năng chính của tín hiệu này là tạm dừng (stop) thực thi của một tiến trình Khi tiến trình nhận được tín hiệu SIGTSTP, nó sẽ tạm dừng và không tiếp tục thực hiện cho đến khi được tiếp tục (resume) bằng tín hiệu SIGCONT hoặc khi được gửi vào nền (background).
- Dưới đây là một số điểm quan trọng về tín hiệu SIGTSTP:
Tổ hợp phím Ctrl + Z là cách phổ biến mà người dùng sử dụng trong terminal để gửi tín hiệu SIGTSTP đến tiến trình đang chạy Hành động này làm tạm dừng tiến trình và chuyển nó vào trạng thái nền (suspended), khiến cho tiến trình không thể thực hiện bất kỳ công việc nào cho đến khi được tiếp tục.
Khi một tiến trình nhận tín hiệu SIGTSTP, nó sẽ tạm dừng và chuyển sang trạng thái nền, không hoạt động cho đến khi nhận tín hiệu SIGCONT để tiếp tục Trong trạng thái nền, tiến trình không tương tác với người dùng và không tiêu tốn tài nguyên CPU.
Tín hiệu SIGTSTP đóng vai trò quan trọng trong việc quản lý tiến trình trong hệ thống, cho phép người dùng tạm dừng và tiếp tục các tiến trình theo ý muốn Điều này giúp người dùng quản lý công việc hiệu quả hơn và tương tác linh hoạt với các tiến trình đang chạy.
Trong lập trình C trên Linux, bạn có thể xử lý tín hiệu SIGTSTP bằng cách đăng ký một hàm xử lý tín hiệu tùy chỉnh thông qua hàm signal() hoặc sigaction() Việc này cho phép bạn xác định hành động cụ thể mà tiến trình sẽ thực hiện khi nhận tín hiệu SIGTSTP.
Tín hiệu SIGTSTP đóng vai trò quan trọng trong quản lý và tương tác với tiến trình trên hệ điều hành Linux, giúp người dùng quản lý công việc hiệu quả Tín hiệu này cho phép tạm dừng và tiếp tục các tiến trình một cách linh hoạt, nâng cao khả năng điều khiển của người dùng đối với các tác vụ đang thực hiện.
Tín hiệu SIGALRM (Signal Alarm) là một tín hiệu quan trọng trong hệ điều hành Linux và Unix, có chức năng thông báo khi một khoảng thời gian đã được thiết lập trước kết thúc.
Khi một chương trình đăng ký xử lý tín hiệu SIGALRM và sử dụng hàm alarm() để thiết lập thời gian đếm ngược, tín hiệu SIGALRM sẽ được gửi đến chương trình khi thời gian đã hết Sau đó, chương trình có thể thực hiện hành động cụ thể khi nhận tín hiệu này.
- Dưới đây là một số điểm quan trọng về tín hiệu SIGALRM:
XÂY DỰNG CHƯƠNG TRÌNH
Phân tích
Bước 1: gọi hàm tín hiệu để tạo tín hiệu
Bước 2: quá trình thực hiện sẽ được bắt đầu
Bước 3: gọi chức năng cảnh báo để tạm dừng việc thực hiện quy trình hiện tại Bước 4: sau đó nó sẽ thực hiện chức năng tín hiệu
Bước 5: một lần nữa quá trình sẽ được tiếp tục
Các bước đã nêu ở trên mô tả quy trình chung sử dụng tín hiệu để tạm dừng và tiếp tục thực hiện trong một chương trình Quy trình này có thể được áp dụng linh hoạt trong nhiều tình huống khác nhau, tùy thuộc vào yêu cầu của ứng dụng hoặc vấn đề cụ thể mà bạn đang đối mặt.
- Tuy nhiên, dưới đây là một mô tả tổng quan về cách chúng có thể được ứng dụng trong một tình huống cụ thể:
Để tạo tín hiệu, bước đầu tiên là gọi hàm tín hiệu bằng cách sử dụng signal() hoặc sigaction() để đăng ký một tín hiệu cụ thể như SIGALRM và xác định hàm xử lý cho tín hiệu đó.
Bước 2 - Quá trình thực hiện bắt đầu: Sau khi bạn đã đăng ký tín hiệu, quá trình thực hiện bắt đầu.
Bước 3 - Gọi chức năng cảnh báo để tạm dừng quá trình thực hiện: Sử dụng hàm alarm() để thiết lập thời gian cảnh báo Khi thời gian đã hết, tín hiệu SIGALRM sẽ được gửi đến tiến trình, dẫn đến việc tạm dừng quá trình thực hiện.
Khi tín hiệu SIGALRM được gửi, hàm xử lý tín hiệu đã được đăng ký sẽ được kích hoạt, cho phép thực hiện các tác vụ cụ thể hoặc chuyển đổi trạng thái của tiến trình.
Bước 5 - Tiếp tục quá trình: Sau khi hoàn thành chức năng tín hiệu, bạn có thể tiến hành các bước tiếp theo để tiếp tục quá trình thực hiện.
Bước 6 - Dừng lại: Quá trình tiếp tục cho đến khi nó hoàn thành hoặc đạt đến điều kiện dừng.
stdio.h: Thư viện này cung cấp các hàm và biến liên quan đến nhập/xuất dữ liệu, chẳng hạn như printf.
stdlib.h: Thư viện này chứa các hàm tiện ích tiêu chuẩn, bao gồm exit() để thoát khỏi chương trình.
unistd.h: Thư viện chứa các hàm hệ thống, chẳng hạn như sleep(), để quản lý thời gian và ngủ (đợi).
Thư viện signal.h cho phép người dùng đăng ký và xử lý tín hiệu trong chương trình Bạn có thể sử dụng hàm signal() để thiết lập các hàm xử lý tín hiệu cho các tín hiệu như SIGTSTP, SIGINT và SIGALRM.
The stdbool.h library offers support for boolean data types (true and false) and is utilized to define variables such as should_continue, program_paused, and signal_tstp_received.
Thư viện time.h là công cụ quan trọng trong việc quản lý thời gian trong lập trình Nó cho phép bạn truy xuất thời gian bắt đầu và thời gian kết thúc của quá trình thực thi chương trình, giúp theo dõi hiệu suất và tối ưu hóa mã nguồn.
- Hàm xử lý tín hiệu SIGALRM (sig_alarm)
// Hàm xử lý tín hiệu SIGALRM void sig_alarm(int signum)
{ signal_alarm_received = true; if (status % 5 == 0){ sprintf(signal_notification, "Nhận được tín hiệu alarm()");
} if (!program_paused) { if (signal_tstp_received) { printf("%d\t\t|\t1\t\t\t|\t%s\t|\tTạm dừng\n", status, signal_notification); // tạm dừng
} else { printf("%d\t\t|\t0\t\t\t|\t%s\t|\tĐang chạy\n", status, signal_notification); // tiếp tục
} alarm(1); // Đặt lại báo động sau 1 giây
} else { alarm(0); // Tắt báo động nếu đang tạm dừng
} signal_alarm_received = false; status++;
Hàm này được gọi khi tín hiệu SIGALRM được kích hoạt, thường sau mỗi lần hết thời gian cảnh báo được đặt (ở đây là 1 giây).
Hàm cập nhật biến signal_alarm_received để xác định rằng tín hiệuSIGALRM đã được nhận.
Nó kiểm tra status để xác định xem có cần hiển thị thông báo tín hiệu hay không và cập nhật signal_notification tương ứng.
Dựa vào trạng thái program_paused và signal_tstp_received, nó in ra bảng theo dõi với trạng thái "Tạm dừng" hoặc "Đang chạy".
Cuối cùng, hệ thống sẽ đặt lại báo động hoặc tắt nó tùy thuộc vào trạng thái hoạt động hiện tại Đồng thời, giá trị status sẽ được tăng lên để xác định thời điểm cần hiển thị thông báo tín hiệu.
- Hàm xử lý tín hiệu SIGTSTP (handle_SIGTSTP)
// Hàm xử lý tín hiệu SIGTSTP (Ctrl+Z) void handle_SIGTSTP(int signum)
The program continues upon receiving a continuation signal, indicated by the message "Continuing the program (Continuation signal received)." Conversely, if a stop signal is detected, the program pauses, displaying the message "Pausing the program (Stop signal received)."
Hàm này được gọi khi tín hiệu SIGTSTP (Ctrl+Z) được gửi.
Nó xử lý việc tạm dừng hoặc tiếp tục chương trình dựa trên biến program_paused và signal_tstp_received.
Nếu program_paused là false, nó sẽ thực hiện tác vụ tạm dừng chương trình và ngược lại nếu program_paused là true.
- Hàm xử lý tín hiệu SIGINT (handle_SIGINT)
// Hàm xử lý tín hiệu SIGINT (Ctrl+C) void handle_SIGINT(int signum)
{ printf("Đã kết thúc chương trình.\n"); should_continue = false;
{ printf("Tiếp tục chương trình.\n"); program_paused = false;
} printf("Đã nhận được tín hiệu SIGINT Kết thúc chương trình.\n"); should_continue = false;
Hàm này được gọi khi tín hiệu SIGINT (Ctrl+C) được gửi.
Nó kiểm tra program_paused và thực hiện việc tạm dừng hoặc kết thúc chương trình dựa trên trạng thái hiện tại của chương trình.
Kết quả chương trình
- Lệnh biên dịch : gcc –o program_name program_name.c
- chạy chương trình: /program_name
Hình 5 Biên dịch và thực thi chương trình
- Sau khi biên dịch chương trình và chạy thì chúng ta sẽ có 1 giao diện minh họa như phía dưới:
Hình 6 Giao diện minh họa ban đầu của chương trình
- Chúng ta sẽ có tất cả 4 cột: thời gian chạy, nhận tín hiệu tạm dừng, nhận tín hiệu thông báo, trạng thái chạy.
Mỗi giây, chương trình sẽ cập nhật trạng thái các cột, bắt đầu từ giây thứ nhất Trong thời gian này, tín hiệu tạm dừng chưa được nhận, vì vậy chương trình vẫn tiếp tục hoạt động bình thường và hiển thị trạng thái "đang chạy" Thời gian chạy ở cột thời gian có thể được thiết lập theo đơn vị tùy ý trong hàm main.
- Sau mỗi 5s chương trình sẽ in ra thông báo nhận được tín hiệu alarm()
Hình 7 Giao diện khi nhận được tín hiệu tạm dừng
- Sử dụng ctrl + z để tạm dừng chương trình
Khi nhận tín hiệu tạm dừng SIGSTP lần đầu, chương trình sẽ cập nhật cột nhận tín hiệu tạm dừng thành số 1, đồng thời cột trạng thái chạy sẽ chuyển sang tạm dừng.
Hình 8 Giao diện khi nhận được tín hiệu tiếp tục
Sau khi nhận tín hiệu tạm dừng SIGSTP lần thứ hai, chương trình sẽ cập nhật cột nhận tín hiệu tạm dừng về số 0 Đồng thời, cột trạng thái sẽ chuyển sang "đang chạy".
- Sử dụng ctrl + z để tiếp tục chương trình
Khi chương trình nhận tín hiệu tạm dừng từ SIGTOP, nó sẽ bị đóng băng Để tiếp tục chương trình, người dùng chỉ cần nhấn tổ hợp phím Ctrl + Z, sau đó chương trình sẽ hoạt động trở lại bình thường.
Hình 9 giao diện khi kết thúc chương trình
Để kết thúc chương trình, bạn sử dụng lệnh Ctrl + C Khi lệnh này được thực hiện, chương trình sẽ dừng hoàn toàn và tất cả các tiến trình con cũng sẽ ngừng hoạt động.
- Nhìn chung, sau khi kết thúc đồ án chúng em đã đạt được những điều sau: + Nắm bắt được các tín hiệu trong c.
+ Hoàn thành quá trình minh họa trong chương trình.
+ Ứng dụng đã hoàn thiện đầy đủ các chức năng cơ bản.
- Bên cạnh đó, còn có một số hạn chế như sau:
+ Giao diện của nhóm còn chưa được đẹp
+ Trong quá trình sử dụng có thể gặp một số lỗi hiển thị.
+ Chưa áp dụng được trí tuệ nhân tạo trong quá trình kiểm duyệt nội dung bài viết mà cần đến sự can thiệp thủ công của admin.
Kết quả chưa đạt được
Chương trình minh họa có thể chưa hoàn thiện hoặc gặp lỗi trong quá trình tạm dừng và tiếp tục bằng tín hiệu, điều này có thể ảnh hưởng đến việc đạt được mục tiêu của đồ án.
Chương trình minh họa thiếu tính ứng dụng thực tế khi chỉ đưa ra ví dụ lý thuyết mà không áp dụng vào cuộc sống hoặc không mang lại giá trị thực tiễn cho người sử dụng, điều này tạo ra một hạn chế đáng kể cho đồ án.
Hiệu suất không ổn định của chương trình có thể gây ra những vấn đề nghiêm trọng trong quá trình tạm dừng và tiếp tục, dẫn đến kết quả không đạt yêu cầu.
Để nâng cao tính đa dạng và phong phú cho ứng dụng, việc mở rộng tính năng là rất cần thiết Các tính năng mới có thể bao gồm quản lý tài nguyên hiệu quả, hỗ trợ đa luồng (multithreading), cải thiện khả năng giao tiếp mạng, và tăng cường quản lý lỗi.
Để cải thiện hiệu suất chương trình, cần tối ưu hóa để đảm bảo hoạt động mượt mà và nhanh chóng, đặc biệt trong việc xử lý tín hiệu và dữ liệu lớn Việc sử dụng các công cụ và kỹ thuật tối ưu hóa mã nguồn sẽ giúp giảm thiểu tiêu tốn tài nguyên, từ đó nâng cao hiệu suất tổng thể.
Cải thiện giao diện người dùng là một yếu tố quan trọng để tăng cường trải nghiệm người dùng, giúp ứng dụng trở nên dễ sử dụng và thân thiện hơn Việc bổ sung các tính năng như biểu đồ, báo cáo và mô tả chi tiết cho quá trình tạm dừng và tiếp tục sẽ tạo ra sự thuận tiện và nâng cao hiệu quả sử dụng.
Tích hợp ứng dụng với các hệ thống thực tế giúp sử dụng hiệu quả quy trình tạm dừng và tiếp tục trong môi trường thực tế, từ đó biến ứng dụng thành công cụ hữu ích cho các dự án thực tiễn.
Lập kế hoạch cẩn thận là yếu tố then chốt trước khi bắt đầu dự án, bao gồm việc xác định mục tiêu, các tính năng cần phát triển và thời gian dự kiến Kế hoạch này không chỉ giúp theo dõi tiến độ mà còn đảm bảo dự án được hoàn thành đúng hạn.
Tối ưu hóa hiệu suất chương trình là yếu tố quan trọng giúp ứng dụng hoạt động mượt mà và hiệu quả Việc áp dụng các kỹ thuật tối ưu hóa cùng với công cụ phân tích sẽ giúp giảm thiểu tiêu tốn tài nguyên và nâng cao hiệu suất tổng thể của ứng dụng.
Thực hiện kiểm tra tự động và thủ công là rất quan trọng để đảm bảo chương trình hoạt động chính xác và ổn định Việc kiểm tra kỹ lưỡng giúp phát hiện và khắc phục lỗi trước khi triển khai chương trình.