logo

utils-std

Collection of commonly available Unix tools git clone https://anongit.hacktivis.me/git/utils-std.git/

nproc.c (1480B)


  1. // utils-std: Collection of commonly available Unix tools
  2. // SPDX-FileCopyrightText: 2017 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
  3. // SPDX-License-Identifier: MPL-2.0
  4. // _SC_NPROCESSORS_CONF &_SC_NPROCESSORS_ONLN got added in POSIX.1-2024
  5. // https://www.austingroupbugs.net/view.php?id=339
  6. #define _DEFAULT_SOURCE
  7. // Sadly {Free,Net}BSD hides _SC_NPROCESSORS_{CONF,ONLN} if _POSIX_C_SOURCE is defined *sigh*
  8. // #define _POSIX_C_SOURCE 202405L
  9. #include <errno.h>
  10. #include <stdio.h> // printf
  11. #include <string.h> // strerror
  12. #include <unistd.h> // sysconf, getopt, opt*
  13. const char *argv0 = "nproc";
  14. static void
  15. usage(void)
  16. {
  17. fprintf(stderr, "Usage: nproc [-a]\n");
  18. }
  19. int
  20. main(int argc, char *argv[])
  21. {
  22. // currently available
  23. int target = _SC_NPROCESSORS_ONLN;
  24. const char *target_str = "_SC_NPROCESSORS_ONLN";
  25. for(int c = -1; (c = getopt(argc, argv, ":a")) != -1;)
  26. {
  27. switch(c)
  28. {
  29. case 'a': // can be made available
  30. target = _SC_NPROCESSORS_CONF;
  31. target_str = "_SC_NPROCESSORS_CONF";
  32. break;
  33. case ':':
  34. fprintf(stderr, "%s: error: Missing operand for option: '-%c'\n", argv0, optopt);
  35. usage();
  36. return 1;
  37. case '?':
  38. fprintf(stderr, "%s: error: Unrecognised option: '-%c'\n", argv0, optopt);
  39. usage();
  40. return 1;
  41. }
  42. }
  43. long np = sysconf(target);
  44. if(np < 0)
  45. {
  46. fprintf(
  47. stderr, "%s: error: Failed getting sysconf '%s': %s\n", argv0, target_str, strerror(errno));
  48. return 1;
  49. }
  50. printf("%ld\n", np);
  51. return 0;
  52. }