xref: /DragonOS/user/apps/test_signal/main.c (revision bc6f0a967c8cb1e9379ced184b25a7722fbda2a4)
11a2eaa40Slogin /**
21a2eaa40Slogin  * @file main.c
31a2eaa40Slogin  * @author longjin (longjin@RinGoTek.cn)
41a2eaa40Slogin  * @brief 测试signal用的程序
51a2eaa40Slogin  * @version 0.1
61a2eaa40Slogin  * @date 2022-12-06
71a2eaa40Slogin  *
81a2eaa40Slogin  * @copyright Copyright (c) 2022
91a2eaa40Slogin  *
101a2eaa40Slogin  */
111a2eaa40Slogin 
121a2eaa40Slogin /**
131a2eaa40Slogin  * 测试signal的kill命令的方法:
141a2eaa40Slogin  * 1.在DragonOS的控制台输入 exec bin/test_signal.elf &
151a2eaa40Slogin  *      请注意,一定要输入末尾的 '&',否则进程不会后台运行
161a2eaa40Slogin  * 2.然后kill对应的进程的pid (上一条命令执行后,将会输出这样一行:"[1] 生成的pid")
171a2eaa40Slogin  *
181a2eaa40Slogin  */
191a2eaa40Slogin 
2064aea4b3SGou Ngai #include <signal.h>
213c82aa56SChiichen #include <stdbool.h>
22*bc6f0a96S裕依 #include <stdio.h>
23*bc6f0a96S裕依 #include <unistd.h>
24*bc6f0a96S裕依 
256efd4740Slogin bool handle_ok = false;
263c82aa56SChiichen int count = 0;
handler(int sig)276efd4740Slogin void handler(int sig)
286efd4740Slogin {
296efd4740Slogin     printf("handle %d\n", sig);
306efd4740Slogin     handle_ok = true;
313c82aa56SChiichen     count++;
326efd4740Slogin }
336efd4740Slogin 
main()341a2eaa40Slogin int main()
351a2eaa40Slogin {
366efd4740Slogin     signal(SIGKILL, &handler);
376efd4740Slogin     printf("registered.\n");
386efd4740Slogin 
391a2eaa40Slogin     while (1)
401a2eaa40Slogin     {
413c82aa56SChiichen         // handler(SIGKILL);
423c82aa56SChiichen         printf("Test signal running\n");
433c82aa56SChiichen         raise(SIGKILL);
446efd4740Slogin         if (handle_ok)
456efd4740Slogin         {
466efd4740Slogin             printf("Handle OK!\n");
476efd4740Slogin             handle_ok = false;
481a2eaa40Slogin         }
493c82aa56SChiichen         if (count > 0)
503c82aa56SChiichen         {
513c82aa56SChiichen             signal(SIGKILL, SIG_DFL);
523c82aa56SChiichen         }
536efd4740Slogin     }
546efd4740Slogin 
551a2eaa40Slogin     return 0;
561a2eaa40Slogin }