Передать указатель на целое число при вызове execv в C - PullRequest
0 голосов
/ 29 сентября 2018

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

Я пытаюсьсохранить счетчик процесса на родительском процессе.И поэтому я подумал о возможности создания указателя на переменную, которая отслеживает, сколько процессов запущено.

Однако это кажется невозможным, поскольку аргументы execv (и программа, выполняемая им)Взятия имеют тип char * const argv[].

Я пытался отслеживать количество процессов, использующих mmap для совместной памяти между процессами, но не смог заставить это работать, так как после вызова execv процесс просто умираети не позволяет мне обновлять счетчик процесса.

Итак, мой вопрос таков: есть ли способ передать указатель на целое число при вызове execv другой программы?

Заранее спасибо.

1 Ответ

0 голосов
/ 29 сентября 2018

Вы не можете осмысленно передать указатель от одного процесса другому, потому что указатель не имеет смысла в другом процессе.Каждый процесс имеет свою собственную память, и адрес относительно этого пространства памяти.Другими словами, менеджер виртуальной памяти позволяет каждому процессу притворяться, что он имеет всю память машины;другие процессы просто невидимы.

Однако у вас есть несколько вариантов настройки связи между связанными процессами.Наиболее очевидным является труба, с которой вы, вероятно, уже сталкивались.Однако это больше работы, потому что вам нужно убедиться, что какой-то процесс всегда прослушивает канал связи.

Другая простая возможность - просто оставить файловый дескриптор открытым, когда вы выполняете fork и exec (см. Подробнее-exec флаг, чтобы увидеть, как этого добиться);хотя mmap не сохраняется exec, вы можете переназначить память на открытый файл в дочернем процессе.Если вы не хотите передавать fd, вы можете отобразить память во временный файл и использовать переменную окружения, чтобы записать имя временного файла.

Другая возможность - Общая память Posix..Опять же, вы можете сообщить имя shm через переменную окружения, а не жестко кодировать его в приложении.

Обратите внимание, что ни общие карты, ни общая память не являются атомарными.Если вы увеличиваете счетчик, вам нужно использовать некоторый механизм блокировки, чтобы избежать условий гонки.

Чтобы получить гораздо больше информации, чем вы на самом деле хотели, вы можете прочитать обзор ESR методов межпроцессного взаимодействия в Глава 7 Искусство программирования Unix .

...