| 34 | } |
| 35 | |
| 36 | void test_sigterm_default(void* /*arg*/) { |
| 37 | klog::Info("=== Signal: SIGTERM Default Test ==="); |
| 38 | bool passed = true; |
| 39 | |
| 40 | auto& tm = TaskManagerSingleton::instance(); |
| 41 | auto* self = tm.GetCurrentTask(); |
| 42 | |
| 43 | auto child = kstd::make_unique<TaskControlBlock>("SigtermTarget", 10, |
| 44 | sigterm_target, nullptr); |
| 45 | child->aux->parent_pid = self->pid; |
| 46 | auto* child_raw = child.get(); |
| 47 | tm.AddTask(std::move(child)); |
| 48 | Pid child_pid = child_raw->pid; |
| 49 | |
| 50 | // Give the child time to start sleeping |
| 51 | (void)sys_sleep(100); |
| 52 | |
| 53 | // Send SIGTERM |
| 54 | int ret = sys_kill(static_cast<int>(child_pid), signal_number::kSigTerm); |
| 55 | if (ret != 0) { |
| 56 | klog::Err("test_sigterm_default: sys_kill returned {}", ret); |
| 57 | passed = false; |
| 58 | } |
| 59 | |
| 60 | // Wait for the child to be terminated |
| 61 | int status = 0; |
| 62 | auto wait_result = tm.Wait(child_pid, &status, false, false); |
| 63 | if (!wait_result.has_value() || wait_result.value() != child_pid) { |
| 64 | klog::Err("test_sigterm_default: Wait failed"); |
| 65 | passed = false; |
| 66 | } else if (status != 128 + signal_number::kSigTerm) { |
| 67 | klog::Err("test_sigterm_default: exit code {} (expected {})", status, |
| 68 | 128 + signal_number::kSigTerm); |
| 69 | passed = false; |
| 70 | } |
| 71 | |
| 72 | if (!passed) { |
| 73 | g_tests_failed++; |
| 74 | } |
| 75 | g_tests_completed++; |
| 76 | klog::Info("Signal SIGTERM Default Test: {}", passed ? "PASSED" : "FAILED"); |
| 77 | sys_exit(passed ? 0 : 1); |
| 78 | } |
| 79 | |
| 80 | // --------------------------------------------------------------------------- |
| 81 | // test_sigkill |