Я пытаюсь написать простую 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()
должен хорошо воспринимать то, что я ему дал. Я скопировал это конкретное использование из онлайн-руководства, но я не очень понимаю его.