diff options
Diffstat (limited to 'src/nproc.c')
-rw-r--r-- | src/nproc.c | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/src/nproc.c b/src/nproc.c new file mode 100644 index 0000000..1615cfd --- /dev/null +++ b/src/nproc.c @@ -0,0 +1,129 @@ +/* nproc - print the number of processors. + Copyright (C) 2009-2020 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <https://www.gnu.org/licenses/>. */ + +/* Written by Giuseppe Scrivano. */ + +#include <config.h> +#include <getopt.h> +#include <stdio.h> +#include <sys/types.h> + +#include "system.h" +#include "error.h" +#include "nproc.h" +#include "quote.h" +#include "xdectoint.h" + +/* The official name of this program (e.g., no 'g' prefix). */ +#define PROGRAM_NAME "nproc" + +#define AUTHORS proper_name ("Giuseppe Scrivano") + +enum +{ + ALL_OPTION = CHAR_MAX + 1, + IGNORE_OPTION +}; + +static struct option const longopts[] = +{ + {"all", no_argument, NULL, ALL_OPTION}, + {"ignore", required_argument, NULL, IGNORE_OPTION}, + {GETOPT_HELP_OPTION_DECL}, + {GETOPT_VERSION_OPTION_DECL}, + {NULL, 0, NULL, 0} +}; + +void +usage (int status) +{ + if (status != EXIT_SUCCESS) + emit_try_help (); + else + { + printf (_("Usage: %s [OPTION]...\n"), program_name); + fputs (_("\ +Print the number of processing units available to the current process,\n\ +which may be less than the number of online processors\n\ +\n\ +"), stdout); + fputs (_("\ + --all print the number of installed processors\n\ + --ignore=N if possible, exclude N processing units\n\ +"), stdout); + + fputs (HELP_OPTION_DESCRIPTION, stdout); + fputs (VERSION_OPTION_DESCRIPTION, stdout); + emit_ancillary_info (PROGRAM_NAME); + } + exit (status); +} + +int +main (int argc, char **argv) +{ + unsigned long nproc, ignore = 0; + initialize_main (&argc, &argv); + set_program_name (argv[0]); + setlocale (LC_ALL, ""); + bindtextdomain (PACKAGE, LOCALEDIR); + textdomain (PACKAGE); + + atexit (close_stdout); + + enum nproc_query mode = NPROC_CURRENT_OVERRIDABLE; + + while (1) + { + int c = getopt_long (argc, argv, "", longopts, NULL); + if (c == -1) + break; + switch (c) + { + case_GETOPT_HELP_CHAR; + + case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS); + + case ALL_OPTION: + mode = NPROC_ALL; + break; + + case IGNORE_OPTION: + ignore = xdectoumax (optarg, 0, ULONG_MAX, "", _("invalid number"),0); + break; + + default: + usage (EXIT_FAILURE); + } + } + + if (argc != optind) + { + error (0, 0, _("extra operand %s"), quote (argv[optind])); + usage (EXIT_FAILURE); + } + + nproc = num_processors (mode); + + if (ignore < nproc) + nproc -= ignore; + else + nproc = 1; + + printf ("%lu\n", nproc); + + return EXIT_SUCCESS; +} |