kcmp(2) сравнивает два процесса, определяя используют ли они общий ресурс

ОБЗОР

#include <linux/kcmp.h>
int kcmp(pid_t pid1, pid_t pid2, int type,
unsigned long idx1, unsigned long idx2);

Замечание: В glibc нет обёрточной функции для данного системного вызова; смотрите ЗАМЕЧАНИЯ.

ОПИСАНИЕ

Системный вызов kcmp() может использоваться для проверки, используют ли два процесса pid1 и pid2 общий ресурс ядра, например виртуальную память, файловые дескрипторы и т.д.

В аргументе type указывается какой ресурс двух процессов нужно сравнивать. Допустимы следующие значения:

KCMP_FILE
Проверить, что файловой дескриптор idx1 в процессе pid1 указывает на тот же открытый файловый дескриптор (смотрите open(2)) что и файловый дескриптор idx2 в процессе pid2.
KCMP_FILES
Проверить, используют ли процессы один и тот же набор открытых файловых дескрипторов. Аргументы idx1 и idx2 игнорируются.
KCMP_FS
Проверить, используют ли процессы общую информацию для файловой системы (т.е. маску прав создания, рабочий каталог и корень файловой системы). Аргументы idx1 и idx2 игнорируются.
KCMP_IO
Проверить, используют ли процессы общий контекст ввода-вывода. Аргументы idx1 и idx2 игнорируются.
KCMP_SIGHAND
Проверить, используют ли процессы общую таблицу обработчиков сигналов. Аргументы idx1 и idx2 игнорируются.
KCMP_SYSVSEM
Проверить, используют ли процессы общий список отмены операций семафоров System V. Аргументы idx1 и idx2 игнорируются.
KCMP_VM
Проверить, используют ли процессы общее адресное пространство. Аргументы idx1 и idx2 игнорируются.

Заметим, что вызов kcmp() не защищён от ложных срабатываний (false positives), которые могут случаться, если задачи находятся в работающем состоянии. Это означает, что для получения достоверных результатов нужно остановить задачи перед выполнением данного системного вызова послав SIGSTOP (смотрите signal(7)).

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении kcmp() возвращает результат арифметического сложения указателей ядра (когда ядро сравнивает ресурсы, оно использует их адреса памяти).

Для простоты объяснения рассмотрим пример. Предположим, что v1 и v2 — адреса соответствующих ресурсов и возвращается значение:

0
v1 равен v2; другими словами, два процесса используют ресурс совместно.
1
v1 меньше v2.
2
v1 больше v2.
3
v1 не равен v2, но нужная информация недоступна.

В случае ошибки возвращается -1 и значение errno устанавливается соответствующим образом.

Значения вызова kcmp() специально выбраны так, чтобы их легко можно было упорядочить. В частности, это удобно когда нужно сравнить большое количество файловых дескрипторов.

ОШИБКИ

EBADF
Значение type равно KCMP_FILE и fd1 или fd2 не являются открытыми файловыми дескрипторами.
EINVAL
Значение type неверно.
EPERM
Недостаточно прав для просмотра ресурсов процесса. Для проверки процессов требуется мандат CAP_SYS_PTRACE, которого у вас нет.
ESRCH
Процесс pid1 или pid2 не существует.

ВЕРСИИ

Системный вызов kcmp() впервые появился в Linux 3.5.

СООТВЕТСТВИЕ СТАНДАРТАМ

Вызов kcmp() есть только в Linux и не должен использоваться в переносимых программах.

ЗАМЕЧАНИЯ

В glibc нет обёртки для данного системного вызова; запускайте его с помощью syscall(2).

Данный системный вызов доступен только, если ядро собрано с параметром CONFIG_CHECKPOINT_RESTORE. Основное предназначение вызова — возможность засечки/восстановления в пользовательском пространстве (CRIU). Альтернативой этому системному вызову было бы выставление соответствующей информации о процессе в файловой системе proc(5); такой вариант не пригоден по причинам безопасности.

Дополнительную информацию об общих ресурсах смотрите в clone(2).