1*ec63e07aSXin Li // Copyright 2019 Google LLC
2*ec63e07aSXin Li //
3*ec63e07aSXin Li // Licensed under the Apache License, Version 2.0 (the "License");
4*ec63e07aSXin Li // you may not use this file except in compliance with the License.
5*ec63e07aSXin Li // You may obtain a copy of the License at
6*ec63e07aSXin Li //
7*ec63e07aSXin Li // https://www.apache.org/licenses/LICENSE-2.0
8*ec63e07aSXin Li //
9*ec63e07aSXin Li // Unless required by applicable law or agreed to in writing, software
10*ec63e07aSXin Li // distributed under the License is distributed on an "AS IS" BASIS,
11*ec63e07aSXin Li // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*ec63e07aSXin Li // See the License for the specific language governing permissions and
13*ec63e07aSXin Li // limitations under the License.
14*ec63e07aSXin Li
15*ec63e07aSXin Li #include <sched.h>
16*ec63e07aSXin Li #include <unistd.h>
17*ec63e07aSXin Li
18*ec63e07aSXin Li #include <csignal>
19*ec63e07aSXin Li #include <cstdint>
20*ec63e07aSXin Li
21*ec63e07aSXin Li constexpr int kProcesses = 512;
22*ec63e07aSXin Li constexpr int kThreads = 1;
23*ec63e07aSXin Li constexpr int kSenders = 1;
24*ec63e07aSXin Li constexpr int kStackSize = 4096;
25*ec63e07aSXin Li
26*ec63e07aSXin Li pid_t g_pids[kProcesses];
27*ec63e07aSXin Li
28*ec63e07aSXin Li uint8_t g_stacks[kThreads][kStackSize] __attribute__((aligned(4096)));
29*ec63e07aSXin Li constexpr int kSignals[] = {
30*ec63e07aSXin Li SIGPROF,
31*ec63e07aSXin Li };
32*ec63e07aSXin Li
SignalHandler(int)33*ec63e07aSXin Li void SignalHandler(int) {}
34*ec63e07aSXin Li
ChildFunc(void *)35*ec63e07aSXin Li int ChildFunc(void*) {
36*ec63e07aSXin Li for (;;) {
37*ec63e07aSXin Li sleep(10);
38*ec63e07aSXin Li }
39*ec63e07aSXin Li }
40*ec63e07aSXin Li
main()41*ec63e07aSXin Li int main() {
42*ec63e07aSXin Li for (int i = 0; i < kProcesses; ++i) {
43*ec63e07aSXin Li int p[2] = {0, 0};
44*ec63e07aSXin Li char c = ' ';
45*ec63e07aSXin Li pipe(p);
46*ec63e07aSXin Li g_pids[i] = fork();
47*ec63e07aSXin Li if (g_pids[i] == 0) {
48*ec63e07aSXin Li for (int sig : kSignals) {
49*ec63e07aSXin Li signal(sig, SignalHandler);
50*ec63e07aSXin Li }
51*ec63e07aSXin Li for (int j = 0; j < kThreads; ++j) {
52*ec63e07aSXin Li int flags = CLONE_FILES | CLONE_FS | CLONE_IO | CLONE_PARENT |
53*ec63e07aSXin Li CLONE_SIGHAND | CLONE_THREAD | CLONE_VM;
54*ec63e07aSXin Li clone(&ChildFunc, g_stacks[j + 1], flags, nullptr, nullptr, nullptr,
55*ec63e07aSXin Li nullptr);
56*ec63e07aSXin Li }
57*ec63e07aSXin Li close(p[0]);
58*ec63e07aSXin Li write(p[1], &c, 1);
59*ec63e07aSXin Li close(p[1]);
60*ec63e07aSXin Li for (;;) {
61*ec63e07aSXin Li sleep(10);
62*ec63e07aSXin Li }
63*ec63e07aSXin Li }
64*ec63e07aSXin Li read(p[0], &c, 1);
65*ec63e07aSXin Li }
66*ec63e07aSXin Li for (int i = 0; i < kSenders; ++i) {
67*ec63e07aSXin Li if (fork() == 0) {
68*ec63e07aSXin Li break;
69*ec63e07aSXin Li }
70*ec63e07aSXin Li }
71*ec63e07aSXin Li for (;;) {
72*ec63e07aSXin Li for (int sig : kSignals) {
73*ec63e07aSXin Li for (int pid : g_pids) {
74*ec63e07aSXin Li kill(pid, sig);
75*ec63e07aSXin Li }
76*ec63e07aSXin Li }
77*ec63e07aSXin Li }
78*ec63e07aSXin Li }
79