new NOFORKs: clear, nproc, tty, uname, arch, unlink, which
[oweals/busybox.git] / coreutils / nproc.c
1 /*
2  * Copyright (C) 2017 Denys Vlasenko <vda.linux@googlemail.com>
3  *
4  * Licensed under GPLv2, see LICENSE in this source tree
5  */
6 //config:config NPROC
7 //config:       bool "nproc (248 bytes)"
8 //config:       default y
9 //config:       help
10 //config:       Print number of CPUs
11
12 //applet:IF_NPROC(APPLET_NOFORK(nproc, nproc, BB_DIR_USR_BIN, BB_SUID_DROP, nproc))
13
14 //kbuild:lib-$(CONFIG_NPROC) += nproc.o
15
16 //usage:#define nproc_trivial_usage
17 //usage:        ""
18 //TODO: "[--all] [--ignore=N]"
19 //usage:#define nproc_full_usage "\n\n"
20 //usage:        "Print number of CPUs"
21
22 #include <sched.h>
23 #include "libbb.h"
24
25 int nproc_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
26 int nproc_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
27 {
28         unsigned long mask[1024];
29         unsigned i, count = 0;
30
31         //applet_long_options = ...;
32         //getopt32(argv, "");
33
34         //if --all, count /sys/devices/system/cpu/cpuN dirs, else:
35
36         if (sched_getaffinity(0, sizeof(mask), (void*)mask) == 0) {
37                 for (i = 0; i < ARRAY_SIZE(mask); i++) {
38                         unsigned long m = mask[i];
39                         while (m) {
40                                 if (m & 1)
41                                         count++;
42                                 m >>= 1;
43                         }
44                 }
45         }
46         if (count == 0)
47                 count++;
48         printf("%u\n", count);
49
50         return 0;
51 }