mirror of
https://git.savannah.gnu.org/git/coreutils.git
synced 2025-09-10 07:59:52 +02:00
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/Makefile.am (nproc.1): Add dependency.
* man/nproc.x: New template.
* man/.gitignore: Ignore generated man page.
* 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 misc/nproc-{avail,positive}.
* tests/misc/nproc-avail: New file.
* tests/misc/nproc-positive: New file.
This commit is contained in:
committed by
Pádraig Brady
parent
41456fac8a
commit
74cf4cb26d
1
AUTHORS
1
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
|
||||
|
||||
4
NEWS
4
NEWS
@@ -62,6 +62,10 @@ GNU coreutils NEWS -*- outline -*-
|
||||
Also, "rm /read-only-fs/nonexistent" now reports "file not found" rather
|
||||
than the less precise "Read-only file system" error.
|
||||
|
||||
** New programs
|
||||
|
||||
nproc: Print the number of processing units available to a process.
|
||||
|
||||
** New features
|
||||
|
||||
env and printenv now accept the option --null (-0), as a means to
|
||||
|
||||
2
README
2
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
|
||||
|
||||
@@ -159,6 +159,7 @@ gnulib_modules="
|
||||
modechange
|
||||
mountlist
|
||||
mpsort
|
||||
nproc
|
||||
obstack
|
||||
pathmax
|
||||
perl
|
||||
|
||||
@@ -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,43 @@ 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
|
||||
|
||||
Print the number of processing units available to the current process,
|
||||
which may be less than the number of online processors.
|
||||
If this information is not accessible, then print the number of
|
||||
processors installed. If the @env{OMP_NUM_THREADS} environment variable is
|
||||
set, then it will determine the returned value. 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 --all
|
||||
@opindex --all
|
||||
Print the number of installed processors on the system, which may
|
||||
be greater than the number online or available to the current process.
|
||||
The @env{OMP_NUM_THREADS} environment variable is not honored in this case.
|
||||
|
||||
@item --ignore=@var{number}
|
||||
@opindex --ignore
|
||||
If possible, exclude this @var{number} of processing units.
|
||||
|
||||
@end table
|
||||
|
||||
@exitstatus
|
||||
|
||||
|
||||
@node uname invocation
|
||||
@section @command{uname}: Print system information
|
||||
|
||||
|
||||
1
man/.gitignore
vendored
1
man/.gitignore
vendored
@@ -48,6 +48,7 @@ mv.1
|
||||
nice.1
|
||||
nl.1
|
||||
nohup.1
|
||||
nproc.1
|
||||
od.1
|
||||
paste.1
|
||||
pathchk.1
|
||||
|
||||
@@ -80,6 +80,7 @@ mv.1: $(common_dep) $(srcdir)/mv.x ../src/mv.c
|
||||
nice.1: $(common_dep) $(srcdir)/nice.x ../src/nice.c
|
||||
nl.1: $(common_dep) $(srcdir)/nl.x ../src/nl.c
|
||||
nohup.1: $(common_dep) $(srcdir)/nohup.x ../src/nohup.c
|
||||
nproc.1: $(common_dep) $(srcdir)/nproc.x ../src/nproc.c
|
||||
od.1: $(common_dep) $(srcdir)/od.x ../src/od.c
|
||||
paste.1: $(common_dep) $(srcdir)/paste.x ../src/paste.c
|
||||
pathchk.1: $(common_dep) $(srcdir)/pathchk.x ../src/pathchk.c
|
||||
|
||||
4
man/nproc.x
Normal file
4
man/nproc.x
Normal file
@@ -0,0 +1,4 @@
|
||||
[NAME]
|
||||
nproc \- print the number of processing units available
|
||||
[DESCRIPTION]
|
||||
.\" Add any additional description here
|
||||
@@ -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
|
||||
|
||||
1
src/.gitignore
vendored
1
src/.gitignore
vendored
@@ -56,6 +56,7 @@ mv
|
||||
nice
|
||||
nl
|
||||
nohup
|
||||
nproc
|
||||
od
|
||||
paste
|
||||
pathchk
|
||||
|
||||
@@ -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)
|
||||
|
||||
127
src/nproc.c
Normal file
127
src/nproc.c
Normal file
@@ -0,0 +1,127 @@
|
||||
/* 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 "error.h"
|
||||
#include "nproc.h"
|
||||
#include "xstrtol.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)
|
||||
fprintf (stderr, _("Try `%s --help' for more information.\n"),
|
||||
program_name);
|
||||
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 ();
|
||||
}
|
||||
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:
|
||||
if (xstrtoul (optarg, NULL, 10, &ignore, "") != LONGINT_OK)
|
||||
{
|
||||
error (0, 0, _("%s: invalid number to ignore"), optarg);
|
||||
usage (EXIT_FAILURE);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
usage (EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
nproc = num_processors (mode);
|
||||
|
||||
if (ignore < nproc)
|
||||
nproc -= ignore;
|
||||
else
|
||||
nproc = 1;
|
||||
|
||||
printf ("%lu\n", nproc);
|
||||
|
||||
exit (EXIT_SUCCESS);
|
||||
}
|
||||
@@ -189,6 +189,8 @@ TESTS = \
|
||||
misc/nice-fail \
|
||||
misc/nl \
|
||||
misc/nohup \
|
||||
misc/nproc-avail \
|
||||
misc/nproc-positive \
|
||||
misc/od-N \
|
||||
misc/od-multiple-t \
|
||||
misc/od-x8 \
|
||||
|
||||
31
tests/misc/nproc-avail
Executable file
31
tests/misc/nproc-avail
Executable file
@@ -0,0 +1,31 @@
|
||||
#!/bin/sh
|
||||
# Ensure that "nproc" is less than 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)
|
||||
|
||||
test $available -le $all || fail=1
|
||||
|
||||
Exit $fail
|
||||
48
tests/misc/nproc-positive
Executable file
48
tests/misc/nproc-positive
Executable file
@@ -0,0 +1,48 @@
|
||||
#!/bin/sh
|
||||
# Ensure that nproc prints a number > 0
|
||||
|
||||
# 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 ''; do
|
||||
procs=$(nproc $mode)
|
||||
test "$procs" -gt 0 || fail=1
|
||||
done
|
||||
|
||||
for i in -1000 0 1 1000; do
|
||||
procs=$(OMP_NUM_THREADS=$i nproc)
|
||||
test "$procs" -gt 0 || fail=1
|
||||
done
|
||||
|
||||
for i in 0 ' 1' 1000; do
|
||||
procs=$(nproc --ignore="$i")
|
||||
test "$procs" -gt 0 || fail=1
|
||||
done
|
||||
|
||||
for i in -1 N; do
|
||||
nproc --ignore=$i && fail=1
|
||||
done
|
||||
|
||||
procs=$(OMP_NUM_THREADS=42 nproc --ignore=40)
|
||||
test "$procs" -eq 2 || fail=1
|
||||
|
||||
Exit $fail
|
||||
Reference in New Issue
Block a user