#c #linux
Вопрос:
Я пытаюсь использовать системный вызов клонирования, и иногда программа не завершается. Эта программа просто создает новый процесс с помощью clone и пытается выполнить команду cat. Вот программа:
#define _GNU_SOURCE
#include <sched.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <unistd.h>
int childFunc(void*arg)
{
char* paramlist[] = {"/bin/cat", "test.txt", NULL};
execv("/bin/cat",paramlist);
_exit(1);
}
int main(void) {
int STACKSIZE = 65536;
void* stack;
stack = malloc(STACKSIZE);
int ret = clone(childFunc, stack STACKSIZE, 0, NULL);
waitpid(ret, NULL, 0);
free(stack);
return 0;
}
Комментарии:
1. Вы пытаетесь создать новый процесс или новый поток? Если это новый процесс, почему вы просто не используете
fork
его ? Если новый поток, что вы ожидаете отexec
семейства функций в многопоточной программе?2. @JosephSible-RestorateMonica для меня требуется использовать клон вместо вилки, но да, я хочу создать новый процесс.
3. Когда вы запустили программу и думаете, что она не заканчивается, что происходит, когда вы нажимаете Enter?
4. @JosephSible-Восстановите монику, да, она заканчивается, почему это происходит?
5.
clone
это не то жеfork
самое, что .’
Ответ №1:
При использовании clone
для создания нового процесса, который вы создадите позже wait
, вам нужно либо перейти SIGCHLD
flags
clone
(рекомендуется, если вы не хотите изменить, какой сигнал отправляется специально), либо перейти __WALL
или __WCLONE
войти options
waitpid
. Смотрите man 2 clone
и man 2 waitpid
для получения более подробной информации. Поскольку вы этого не делали, waitpid
вызов syscall не удался из-за того, что вам не нужно было ничего ждать, вместо того чтобы ждать завершения дочернего процесса. Это привело к тому, что содержимое test.txt
было распечатано после запроса оболочки, что заставило вас думать, что оно все еще работает, хотя это и не так. Вы бы заметили это, если бы проверили waitpid
возвращаемый результат.