Hi Pádraig, Pádraig Brady <p...@draigbrady.com> writes:
> Well --available and --all are mutually exclusive and related. > That fact is obvious if they're parameters to a single option. > But I do take your point that --count is a bit redundant, > and I don't see nproc getting many other options, so OK > leave them as separate options. > > I'll hope to commit this soon. I amended this change and the bug in the texinfo documentation reported by Paolo. I hope it is fine now. Cheers, Giuseppe >From 3e639852488e44c88c040d8b993dade4a3e81407 Mon Sep 17 00:00:00 2001 From: Giuseppe Scrivano <gscriv...@gnu.org> Date: Sat, 31 Oct 2009 18:59:50 +0100 Subject: [PATCH] nproc: A new program to count the available processors * AUTHORS: Add my name. * NEWS: Mention it. * README: Likewise. * bootstrap.conf (gnulib_modules): Add nproc. * doc/coreutils.texi (nproc invocation): Add nproc info. * man/.gitignore: Exclude nproc.1. * po/POTFILES.in: Add src/nproc.c. * src/.gitignore: Exclude nproc. * src/Makefile.am (EXTRA_PROGRAMS): Add nproc. * src/nproc.c: New file. * tests/Makefile.am (TESTS): Add nproc/{avail, cpuinfo, positive}. * tests/nproc/avail: New file. * tests/nproc/cpuinfo: New file. * tests/nproc/positive: New file. --- AUTHORS | 1 + NEWS | 4 ++ README | 2 +- bootstrap.conf | 1 + doc/coreutils.texi | 44 +++++++++++++++++ man/.gitignore | 1 + po/POTFILES.in | 1 + src/.gitignore | 1 + src/Makefile.am | 3 + src/nproc.c | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++ tests/Makefile.am | 3 + tests/nproc/avail | 31 ++++++++++++ tests/nproc/cpuinfo | 33 +++++++++++++ tests/nproc/positive | 39 +++++++++++++++ 14 files changed, 289 insertions(+), 1 deletions(-) create mode 100644 src/nproc.c create mode 100755 tests/nproc/avail create mode 100755 tests/nproc/cpuinfo create mode 100755 tests/nproc/positive diff --git a/AUTHORS b/AUTHORS index 59a0dfa..0c15472 100644 --- a/AUTHORS +++ b/AUTHORS @@ -51,6 +51,7 @@ mv: Mike Parker, David MacKenzie, Jim Meyering nice: David MacKenzie nl: Scott Bartram, David MacKenzie nohup: Jim Meyering +nproc: Giuseppe Scrivano od: Jim Meyering paste: David M. Ihnat, David MacKenzie pathchk: Paul Eggert, David MacKenzie, Jim Meyering diff --git a/NEWS b/NEWS index 5b75dbb..8c1614e 100644 --- a/NEWS +++ b/NEWS @@ -77,6 +77,10 @@ GNU coreutils NEWS -*- outline -*- touch now accepts the option --no-dereference (-h), as a means to change symlink timestamps on platforms with enough support. +** New programs + + nproc: A new program to print the number of processors. + * Noteworthy changes in release 8.0 (2009-10-06) [beta] diff --git a/README b/README index 7545eab..0951b62 100644 --- a/README +++ b/README @@ -11,7 +11,7 @@ The programs that can be built with this package are: csplit cut date dd df dir dircolors dirname du echo env expand expr factor false fmt fold groups head hostid hostname id install join kill link ln logname ls md5sum mkdir mkfifo mknod mktemp mv nice nl nohup - od paste pathchk pinky pr printenv printf ptx pwd readlink rm rmdir + nproc od paste pathchk pinky pr printenv printf ptx pwd readlink rm rmdir runcon seq sha1sum sha224sum sha256sum sha384sum sha512sum shred shuf sleep sort split stat stdbuf stty su sum sync tac tail tee test timeout touch tr true truncate tsort tty uname unexpand uniq unlink uptime users diff --git a/bootstrap.conf b/bootstrap.conf index b3a82e0..53d3824 100644 --- a/bootstrap.conf +++ b/bootstrap.conf @@ -158,6 +158,7 @@ gnulib_modules=" modechange mountlist mpsort + nproc obstack pathmax perl diff --git a/doc/coreutils.texi b/doc/coreutils.texi index 227014c..f998a6e 100644 --- a/doc/coreutils.texi +++ b/doc/coreutils.texi @@ -84,6 +84,7 @@ * nice: (coreutils)nice invocation. Modify niceness. * nl: (coreutils)nl invocation. Number lines and write files. * nohup: (coreutils)nohup invocation. Immunize to hangups. +* nproc: (coreutils)nproc invocation. Print the number of processors. * od: (coreutils)od invocation. Dump files in octal, etc. * paste: (coreutils)paste invocation. Merge lines of files. * pathchk: (coreutils)pathchk invocation. Check file name portability. @@ -410,6 +411,7 @@ System context * arch invocation:: Print machine hardware name * date invocation:: Print or set system date and time +* nproc invocation:: Print the number of processors * uname invocation:: Print system information * hostname invocation:: Print or set system name * hostid invocation:: Print numeric host identifier @@ -13407,6 +13409,7 @@ information. @menu * date invocation:: Print or set system date and time. * arch invocation:: Print machine hardware name. +* nproc invocation:: Print the number of processors. * uname invocation:: Print system information. * hostname invocation:: Print or set system name. * hostid invocation:: Print numeric host identifier. @@ -14066,6 +14069,47 @@ The program accepts the @ref{Common options} only. @exitstatus +...@node nproc invocation +...@section @command{nproc}: Print the number of available processors + +...@pindex nproc +...@cindex Print the number of processors +...@cindex system information, printing + +...@command{nproc} prints the number of processing units available +to the current process. The result is guaranteed to be greater than +zero. Synopsis: + +...@example +nproc [...@var{option}] +...@end example + +The program accepts the following options. Also see @ref{Common options}. + +...@table @samp + +...@item --available +...@opindex --available +Print the number of processors available to the current process. It +may be less than the number of installed processors. +If this information is not accessible, then nproc returns the number of +installed processors. If the @env{OMP_NUM_THREADS} variable is +defined, then its value is honored. By default --available is used. + +...@item --all +...@opindex --all +Print the number of installed processors on the system which may +be greater than is available to the current process. + +...@item --igno...@var{number} +...@opindex --ignore +The number of processing units to disregard if possible. + +...@end table + +...@exitstatus + + @node uname invocation @section @command{uname}: Print system information diff --git a/man/.gitignore b/man/.gitignore index 1085ff0..2c2ffcd 100644 --- a/man/.gitignore +++ b/man/.gitignore @@ -48,6 +48,7 @@ mv.1 nice.1 nl.1 nohup.1 +nproc.1 od.1 paste.1 pathchk.1 diff --git a/po/POTFILES.in b/po/POTFILES.in index e84e2ea..9a46a9a 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -89,6 +89,7 @@ src/mv.c src/nice.c src/nl.c src/nohup.c +src/nproc.c src/od.c src/operand2sig.c src/paste.c diff --git a/src/.gitignore b/src/.gitignore index f2886de..d397370 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -56,6 +56,7 @@ mv nice nl nohup +nproc od paste pathchk diff --git a/src/Makefile.am b/src/Makefile.am index 67c29cc..be1df2b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -86,6 +86,7 @@ EXTRA_PROGRAMS = \ mktemp \ mv \ nl \ + nproc \ nohup \ od \ paste \ @@ -189,6 +190,7 @@ chown_LDADD = $(LDADD) chroot_LDADD = $(LDADD) cksum_LDADD = $(LDADD) comm_LDADD = $(LDADD) +nproc_LDADD = $(LDADD) cp_LDADD = $(LDADD) csplit_LDADD = $(LDADD) cut_LDADD = $(LDADD) @@ -480,6 +482,7 @@ rmdir_SOURCES = rmdir.c prog-fprintf.c uname_SOURCES = uname.c uname-uname.c arch_SOURCES = uname.c uname-arch.c +nproc_SOURCES = nproc.c md5sum_SOURCES = md5sum.c md5sum_CPPFLAGS = -DHASH_ALGO_MD5=1 $(AM_CPPFLAGS) diff --git a/src/nproc.c b/src/nproc.c new file mode 100644 index 0000000..35e79de --- /dev/null +++ b/src/nproc.c @@ -0,0 +1,126 @@ +/* nproc - print the number of processors. + Copyright (C) 2009 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 <http://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 "nproc.h" + +/* The official name of this program (e.g., no `g' prefix). */ +#define PROGRAM_NAME "nproc" + +#define AUTHORS proper_name ("Giuseppe Scrivano") + +enum +{ + AVAILABLE_OPTION = CHAR_MAX + 1, + ALL_OPTION, + IGNORE_OPTION +}; + +static struct option const longopts[] = +{ + {"available", no_argument, NULL, AVAILABLE_OPTION}, + {"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) + fprintf (stderr, _("Try `%s --help' for more information.\n"), + program_name); + else + { + printf (_("Usage: %s [OPTION]...\n"), program_name); + fputs (_("\ +Print the number of processors.\n\ +\n\ +"), stdout); + fputs (_("\ + --available print the number of processors available to the\n\ + current process\n\ + --all print the number of installed processors\n\ + --ignore=N if possible, disregard N processing units\n\ +"), stdout); + + fputs (HELP_OPTION_DESCRIPTION, stdout); + fputs (VERSION_OPTION_DESCRIPTION, stdout); + emit_ancillary_info (); + } + 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 AVAILABLE_OPTION: + mode = NPROC_CURRENT_OVERRIDABLE; + break; + + case ALL_OPTION: + mode = NPROC_ALL; + break; + + case IGNORE_OPTION: + ignore = strtoul (optarg, NULL, 10); + break; + + default: + usage (EXIT_FAILURE); + } + } + + nproc = num_processors (mode); + if (ignore < nproc) + nproc -= ignore; + else + nproc = 1; + + printf ("%lu\n", nproc); + + exit (EXIT_SUCCESS); +} diff --git a/tests/Makefile.am b/tests/Makefile.am index f67b796..d9b7678 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -461,6 +461,9 @@ TESTS = \ touch/read-only \ touch/relative \ touch/trailing-slash \ + nproc/avail \ + nproc/cpuinfo \ + nproc/positive \ $(root_tests) pr_data = \ diff --git a/tests/nproc/avail b/tests/nproc/avail new file mode 100755 index 0000000..06a64ea --- /dev/null +++ b/tests/nproc/avail @@ -0,0 +1,31 @@ +#!/bin/sh +# Ensure that "nproc --available" is greater or equal to "nproc --all". + +# Copyright (C) 2009 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 <http://www.gnu.org/licenses/>. + +if test "$VERBOSE" = yes; then + set -x + nproc --version +fi + +. $srcdir/test-lib.sh + +all=$(nproc --all) + +available=$(OMP_NUM_THREADS= nproc --available) +test $available -ge $all || fail=1 + +Exit $fail diff --git a/tests/nproc/cpuinfo b/tests/nproc/cpuinfo new file mode 100755 index 0000000..2c9188f --- /dev/null +++ b/tests/nproc/cpuinfo @@ -0,0 +1,33 @@ +#!/bin/sh +# Check that the number of processors reported by nproc is equal to the number +# of processors listed in /proc/cpuinfo, when it is available. + +# Copyright (C) 2009 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 <http://www.gnu.org/licenses/>. + +if test "$VERBOSE" = yes; then + set -x + nproc --version +fi + +. $srcdir/test-lib.sh + +test -r /proc/cpuinfo || skip_test_ + +processors=$(nproc --all) + +test $(grep '^proc' /proc/cpuinfo | wc -l) -eq $processors || fail=1 + +Exit $fail diff --git a/tests/nproc/positive b/tests/nproc/positive new file mode 100755 index 0000000..b7d57d5 --- /dev/null +++ b/tests/nproc/positive @@ -0,0 +1,39 @@ +#!/bin/sh +# Ensure that nproc returns a non-zero positive number + +# Copyright (C) 2009 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 <http://www.gnu.org/licenses/>. + +if test "$VERBOSE" = yes; then + set -x + nproc --version +fi + +. $srcdir/test-lib.sh + +for mode in --all --available; do + procs=$(nproc $mode) + test $procs -gt 0 || fail=1 +done + +for i in -1000 0 1000; do + procs=$(OMP_NUM_THREADS=$i nproc --available) + test $procs -gt 0 || fail=1 + + procs=$(nproc --available --ignore=$i) + test $procs -gt 0 || fail=1 +done + +Exit $fail -- 1.6.5