1e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/*
2e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *
4e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * you may not use this file except in compliance with the License.
6e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * You may obtain a copy of the License at
7e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *
8e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *
10e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * See the License for the specific language governing permissions and
14e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * limitations under the License.
15e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *
16e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Simple cpu eater busy loop. Runs as a daemon. prints the child PID to
17e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * std so you can easily kill it later.
18e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project */
19e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
20e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdio.h>
21e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <unistd.h>
22e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdlib.h>
23e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <fcntl.h>
24e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <sys/types.h>
25e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <sys/stat.h>
26e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
27e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
28e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint main(int argc, char *argv[])
29e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
30e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pid_t pid;
31e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    int life_universe_and_everything;
32e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    int fd;
33e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
34e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    switch(fork()) {
35e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        case -1:
36e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            perror(argv[0]);
37e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            exit(1);
38e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            break;
39e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        case 0: /* child */
40e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            chdir("/");
41e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            umask(0);
42e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            setpgrp();
43e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            setsid();
44e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            /* fork again to fully detach from controlling terminal. */
45e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project            switch(pid = fork()) {
46e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                case -1:
47e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                    break;
48e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                case 0: /* second child */
49e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                    /* redirect to /dev/null */
50e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                    close(0);
51e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                    open("/dev/null", 0);
52e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                    close(1);
53e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                    if(open("/dev/null", O_WRONLY) < 0) {
54e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        perror("/dev/null");
55e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        exit(1);
56e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                    }
57e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                    fflush(stdout);
58e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                    close(2);
59e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                    dup(1);
60e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                    for (fd = 3; fd < 256; fd++) {
61e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        close(fd);
62e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                    }
63e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                    /* busy looper */
64e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                    while (1) {
65e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                        life_universe_and_everything = 42 * 2;
66e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                    }
67e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                  default:
68e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                      /* so caller can easily kill it later. */
69e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                      printf("%d\n", pid);
70e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                      exit(0);
71e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                      break;
72e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                }
73e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                break;
74e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project          default:
75e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project              exit(0);
76e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project              break;
77e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
78e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project  return 0;
79e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
80e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
81e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
82e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* vim:ts=4:sw=4:softtabstop=4:smarttab:expandtab */
83e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
84