C в Ubuntu Linux - не удается выполнить c разветвленный процесс - PullRequest
1 голос
/ 05 мая 2020

Я пытаюсь написать простую C программу в Ubuntu Linux, которая использует пару процессов для подключения к общей памяти и чтения / записи данных из / в нее. Общая последовательность такова:

  • Выполнить процесс 1
  • Процесс 1 выделяет и подключается к общей памяти
  • Процесс 1 разветвляется на процесс 2
  • Процесс 2 execs, передавая «себе» идентификатор общей памяти в качестве аргумента командной строки и запуская новый двоичный файл (DP-2) в том же каталоге
  • Процесс 2 использует идентификатор общей памяти для подключения к общей памяти

Звонок exec() вызывает у меня проблемы. Я проверил, что процесс 1 распределяет и подключается к общей памяти правильно, правильно разветвляется, и что процесс 2 может подключаться к общей памяти после разветвления («изнутри» процесса 1). Однако я не могу получить вызов exec() для запуска новой программы. Вместо этого он просто останавливается и в конечном итоге завершается.

Общий код распределен по нескольким исходным файлам и содержит множество отладочных операторов, поэтому я включил только разделы, которые обрабатывают вызовы fork() и exec().

Шаг 1: получите идентификатор общей памяти. SHAREDBUFFER вот структура разделяемой памяти, которую я использую.

shmID = shmget(shmkey, sizeof(SHAREDBUFFER), IPC_CREAT | 0660);

Шаг 2: поместите идентификатор общей памяти в массив строк, чтобы его можно было передать в exec().

char* argv[3] = {"Command-line", shmID, NULL};

Шаг 3: разветвите и проверьте, является ли это дочерним процессом. Если это так, exe c функция DP-2 с аргументами командной строки из шага 2.

forkReturn = fork();

if (forkReturn == FORK_FAILURE) {
    // handle the failure
}
else if (forkReturn == IS_CHILD) {
    execvp("DP-2", argv);
    exit(0);
}
// other code for parent process

Дополнительные примечания:

  • Я знаю, что shmID следует преобразовать в строку при сохранении в argv. Я изменю это, как только смогу.

  • Программа DP-2 в настоящее время является программой hello world. Он может работать без аргументов командной строки, и я почти уверен, что проблема не в том, чтобы ie дать ему целое число там, где ожидается c -строка.

  • Я осознавая, что разные функции exec() имеют разные цели, но я считаю, что execvp() должен хорошо воспринимать то, что я ему дал. Я скопировал это конкретное использование из онлайн-руководства, но я не очень понимаю его.

...