proc-2-is-kthread.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. /*
  2. * Copyright (c) 2024 Alexey Dobriyan <adobriyan@gmail.com>
  3. *
  4. * Permission to use, copy, modify, and distribute this software for any
  5. * purpose with or without fee is hereby granted, provided that the above
  6. * copyright notice and this permission notice appear in all copies.
  7. *
  8. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  9. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  11. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  13. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  14. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. */
  16. /* Test that kernel thread is reported as such. */
  17. #undef NDEBUG
  18. #include <assert.h>
  19. #include <errno.h>
  20. #include <fcntl.h>
  21. #include <string.h>
  22. #include <unistd.h>
  23. int main(void)
  24. {
  25. /*
  26. * The following solutions don't really work:
  27. *
  28. * 1) jit kernel module which creates kernel thread:
  29. * test becomes arch-specific,
  30. * problems with mandatory module signing,
  31. * problems with lockdown mode,
  32. * doesn't work with CONFIG_MODULES=n at all,
  33. * kthread creation API is formally unstable internal kernel API,
  34. * need a mechanism to report test kernel thread's PID back,
  35. *
  36. * 2) ksoftirqd/0 and kswapd0 look like stable enough kernel threads,
  37. * but their PIDs are unstable.
  38. *
  39. * Check against kthreadd which always seem to exist under pid 2.
  40. */
  41. int fd = open("/proc/2/status", O_RDONLY);
  42. assert(fd >= 0);
  43. char buf[4096];
  44. ssize_t rv = read(fd, buf, sizeof(buf));
  45. assert(0 <= rv && rv < sizeof(buf));
  46. buf[rv] = '\0';
  47. assert(strstr(buf, "Kthread:\t1\n"));
  48. return 0;
  49. }