nproc: implement --all --ignore=N
No binary (build failed)
—
(log yok)
| @@ -14,10 +14,14 @@ | |
| //kbuild:lib-$(CONFIG_NPROC) += nproc.o | |
| //usage:#define nproc_trivial_usage | |
| - | //usage: "" |
| - | //TODO: "[--all] [--ignore=N]" |
| + | //usage: ""IF_LONG_OPTS("--all --ignore=N") |
| //usage:#define nproc_full_usage "\n\n" | |
| - | //usage: "Print number of CPUs" |
| + | //usage: "Print number of available CPUs" |
| + | //usage: IF_LONG_OPTS( |
| + | //usage: "\n" |
| + | //usage: "\n --all Number of installed CPUs" |
| + | //usage: "\n --ignore=N Exclude N CPUs" |
| + | //usage: ) |
| #include <sched.h> | |
| #include "libbb.h" | |
| @@ -26,13 +30,30 @@ int nproc_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | |
| int nproc_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM) | |
| { | |
| unsigned long mask[1024]; | |
| - | unsigned i, count = 0; |
| - | |
| - | //getopt32(argv, ""); |
| - | |
| - | //if --all, count /sys/devices/system/cpu/cpuN dirs, else: |
| + | int count = 0; |
| + | #if ENABLE_LONG_OPTS |
| + | int ignore = 0; |
| + | int opts = getopt32long(argv, "\xfe:+", |
| + | "ignore\0" Required_argument "\xfe" |
| + | "all\0" No_argument "\xff" |
| + | , &ignore |
| + | ); |
| + | if (opts & (1 << 1)) { |
| + | DIR *cpusd = opendir("/sys/devices/system/cpu"); |
| + | if (cpusd) { |
| + | struct dirent *de; |
| + | while (NULL != (de = readdir(cpusd))) { |
| + | char *cpuid = strstr(de->d_name, "cpu"); |
| + | if (cpuid && isdigit(cpuid[strlen(cpuid) - 1])) |
| + | count++; |
| + | } |
| + | closedir(cpusd); |
| + | } |
| + | } else |
| + | #endif |
| if (sched_getaffinity(0, sizeof(mask), (void*)mask) == 0) { | |
| + | int i; |
| for (i = 0; i < ARRAY_SIZE(mask); i++) { | |
| unsigned long m = mask[i]; | |
| while (m) { | |
| @@ -42,8 +63,11 @@ int nproc_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM) | |
| } | |
| } | |
| } | |
| - | if (count == 0) |
| - | count++; |
| + | |
| + | IF_LONG_OPTS(count -= ignore;) |
| + | if (count <= 0) |
| + | count = 1; |
| + | |
| printf("%u\n", count); | |
| return 0; | |