Linux: использование «clone3» и «waitid» ⇐ Linux
-
Anonymous
Linux: использование «clone3» и «waitid»
Я пытаюсь узнать о процессах разветвления/клонирования с помощью системного вызова «clone3». Я прочитал страницы руководства, чтобы понять это. Помимо страниц руководства, мне удалось найти только ОДИН пример его использования в Интернете (в Интернете), и он, похоже, не работает. Кроме того, в примере используется функция libc «waitpid» вместо системного вызова «waitid», который я хочу использовать. В заключение я изменил пример, «преобразовав» его в следующий код:
#ifndef _GNU_SOURCE #define _GNU_SOURCE 1 #endif #include #include #include #include #include #include #include #include #include #ifndef CLONE_PIDFD #define CLONE_PIDFD 0x00001000 #endif #ifndef __NR_clone3 #define __NR_clone3 -1 структура clone_args { флаги __aligned_u64; __aligned_u64 pidfd; __aligned_u64 child_tid; __aligned_u64 родитель_тид; __aligned_u64 выход_сигнал; стек __aligned_u64; __aligned_u64 stack_size; __aligned_u64 тлс; }; #endif static pid_t sys_clone3(struct clone_args *args) { return syscall(__NR_clone3, args, sizeof(struct clone_args)); } статический int sys_waitid( тип idtype_t, идентификатор id_t, информация siginfo_t*, использование структуры rusage*, параметры int) { вернуть системный вызов (247, тип, идентификатор, информация, использование, параметры); } целое значение = 10; int main(int argc, char *argv[]) { struct clone_args args = { .флаги = CLONE_VM, .exit_signal = SIGCHLD, }; int pid = sys_clone3(&args); если (пид
Я пытаюсь узнать о процессах разветвления/клонирования с помощью системного вызова «clone3». Я прочитал страницы руководства, чтобы понять это. Помимо страниц руководства, мне удалось найти только ОДИН пример его использования в Интернете (в Интернете), и он, похоже, не работает. Кроме того, в примере используется функция libc «waitpid» вместо системного вызова «waitid», который я хочу использовать. В заключение я изменил пример, «преобразовав» его в следующий код:
#ifndef _GNU_SOURCE #define _GNU_SOURCE 1 #endif #include #include #include #include #include #include #include #include #include #ifndef CLONE_PIDFD #define CLONE_PIDFD 0x00001000 #endif #ifndef __NR_clone3 #define __NR_clone3 -1 структура clone_args { флаги __aligned_u64; __aligned_u64 pidfd; __aligned_u64 child_tid; __aligned_u64 родитель_тид; __aligned_u64 выход_сигнал; стек __aligned_u64; __aligned_u64 stack_size; __aligned_u64 тлс; }; #endif static pid_t sys_clone3(struct clone_args *args) { return syscall(__NR_clone3, args, sizeof(struct clone_args)); } статический int sys_waitid( тип idtype_t, идентификатор id_t, информация siginfo_t*, использование структуры rusage*, параметры int) { вернуть системный вызов (247, тип, идентификатор, информация, использование, параметры); } целое значение = 10; int main(int argc, char *argv[]) { struct clone_args args = { .флаги = CLONE_VM, .exit_signal = SIGCHLD, }; int pid = sys_clone3(&args); если (пид
Мобильная версия