Системный вызов блокируется (программа не завершится) при создании нового процесса

#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 возвращаемый результат.