Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 08a63ae

Browse files
author
Anton Yarkov
committed
How to handle SIGTERM and SIGINT to manage processes. Task: create a non-killable process.
1 parent 713e8e0 commit 08a63ae

File tree

1 file changed

+92
-0
lines changed

1 file changed

+92
-0
lines changed
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
#include <signal.h>
2+
#include <stdio.h>
3+
#include <stdlib.h>
4+
#include <unistd.h>
5+
#include <sys/wait.h>
6+
7+
#define EXIT_FAILURE 1
8+
9+
pid_t child_pid;
10+
11+
// Compilation:
12+
// gcc "01 - Signals_SIGINT_SIGTERM_nonkillable_parent.c" -o nonkillable_parent
13+
14+
// Task:
15+
// Create a program which creates a child process and this child process can be killed by SIGTERM or SIGINT.
16+
// However, parent should not be killed by first SIGTERM/SIGINT. It may be killed in further signals.
17+
18+
void cant_stop_me_handler(int sig)
19+
{
20+
if (child_pid)
21+
{
22+
raise(-9); // or kill(-9, child_pid);
23+
printf("SIGCHLD Child: killed %d.\n", child_pid);
24+
}
25+
else
26+
{
27+
printf("SIGCHLD Parent: Ha-ha, can't kill me this time :)! (try again)\n");
28+
}
29+
}
30+
31+
void cant_stop_me_handler_int(int sig)
32+
{
33+
if (child_pid)
34+
{
35+
raise(-9); // or kill(-9, child_pid);
36+
printf("SIGINT Child: killed %d.\n", child_pid);
37+
}
38+
else
39+
{
40+
printf("SIGINT Parent: Ha-ha, can't kill me this time :)! (try again)\n");
41+
}
42+
}
43+
44+
int main()
45+
{
46+
pid_t main_pid = getpid();
47+
48+
printf("Start of process %d forever.\n", main_pid);
49+
50+
// Do no stop by SIGTERM.
51+
struct sigaction cant_stop_me_signal;
52+
cant_stop_me_signal.sa_handler = cant_stop_me_handler;
53+
sigemptyset(&cant_stop_me_signal.sa_mask);
54+
cant_stop_me_signal.sa_flags = SA_RESETHAND; // Non-permanent handler. Handle only first time...
55+
56+
if (sigaction(SIGTERM, &cant_stop_me_signal, 0) == -1)
57+
{
58+
perror("Error of calling sigaction in parent.");
59+
exit(EXIT_FAILURE);
60+
}
61+
62+
// Do no stop by SIGINT.
63+
struct sigaction cant_stop_me_signal1;
64+
cant_stop_me_signal1.sa_handler = cant_stop_me_handler_int;
65+
sigemptyset(&cant_stop_me_signal1.sa_mask);
66+
cant_stop_me_signal1.sa_flags = SA_RESETHAND; // Non-permanent handler. Handle only first time...
67+
68+
if (sigaction(SIGINT, &cant_stop_me_signal1, 0) == -1)
69+
{
70+
perror("Error of calling sigaction in parent.");
71+
exit(EXIT_FAILURE);
72+
}
73+
74+
// Make child.
75+
if((child_pid = fork()))
76+
{
77+
printf("Start of child process %d forever. Press Ctrl+C OR write 'kill -9 %d' to terminate child.\n", child_pid, child_pid);
78+
}
79+
else
80+
{
81+
// Do anything in child.
82+
}
83+
84+
while(1)
85+
{
86+
// Forever... until someone press Ctrl+C or write 'kill -9 xxxx'
87+
}
88+
89+
printf("End of process %d\n", getpid());
90+
91+
exit(0);
92+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /