Запустите две программы на C одновременно, совместно используя память, как? - PullRequest
2 голосов
/ 12 ноября 2011

У меня есть два c файла: продюсер.c и потребитель.c.Потребитель создает общий буфер в памяти и ждет, когда производитель поместит элементы в буфер для потребления.Producer присоединяет разделяемую память к своей карте памяти, а затем начинает помещать элементы в буфер.

Вопрос состоит в том, как скомпилировать и запустить их вместе?

Вот фактическое назначение.(Я знаю, что могу сделать это с одним файлом c, используя потоки, но это не так, как меня просят.)

В этой части вы разработаете приложение-потребитель-потребитель, которое будет использовать разделяемую памятьдля связи между процессами (общая память POSIX, а не общая память System V).Там будет N производителей и N потребителей.N может быть 1, 2 или 3.

Вы разработаете программу продюсера (seller.c) и программу потребителя (consumer.c).При запуске программа-производитель создаст N дочерних процессов, которые будут действовать как N производителей (т.е. каждый дочерний процесс будет процессом-производителем).

Аналогично, при запуске потребительская программа создаст N дочерних процессов, где каждый дочерний процесс будет действовать как потребительский процесс.Вы будете считать, что потребители идентифицируются как 0, 1, 2, в зависимости от N. Например, если N равно 2, тогда будет два потребителя, 0 и 1.

Программа-потребитель будет запущена первой.При запуске программа-потребитель сначала создает общую память размером 4 КБ.Эта общая память будет местом, где у вас будет общий буфер.Доступ к буферу могут получить производители и потребители.Размер буфера равен 100. Он может содержать не более 100 элементов (целых чисел).В общей памяти у вас могут быть другие общие переменные, которые вы считаете необходимыми.Потребительская программа также создаст один или несколько семафоров (вы сами решаете, сколько).

Затем он создаст N дочерних процессов (N потребителей) с помощью системного вызова fork () (вам не нужно использовать системный вызов exec ()).Основной процесс программы-потребителя (родительский) после создания дочерних процессов не должен завершаться.Следует подождать, пока все дети (то есть потребители) выполнят свои задачи и прекратят работу.Когда все дочерние элементы прерываются, он удаляет (удаляет) общую память из системы.Также будут удалены (удалены) семафоры.Тогда это может закончиться также.

Каждый производитель будет читать входной файл положительных целых чисел (одно целое число в строке) и просто будет передавать целые числа через общий буфер, расположенный в общей памяти (созданной программой-потребителем) между производителями и потребителями.

Каждый потребитель будет читать целые числа из общего буфера и записывать полученное целое число z в выходной файл, связанный с потребителем, если z mod N равно ID потребителя.Например, если N равно 3 и если идентификатор потребителя равен 2 и потребитель получил целое число 7, он ничего не будет с ним делать (игнорировать), но если он получит 8, он запишет целое число в свой выходной файл,Выходной файл будет содержать одно целое число в строке.Пока производители и потребители получают доступ к общему буферу, они должны использовать семафоры, чтобы доступ был синхронизирован.Кроме того, если буфер заполнен, производители должны спать, а если нечего потреблять, потребители должны спать.Мы не должны были заняты ожиданием.Вы будете использовать семафоры POSIX (называемые семафорами).Потребительская программа будет вызываться следующим образом:
потребитель N…

Здесь N - количество создаваемых процессов потребителя.Значение этого параметра должно совпадать с соответствующим параметром программы-производителя.Здесь это имя выходного файла, который будет использоваться потребителем с идентификатором X. Число введенных имен выходных файлов будет равно N. Это имя, которое мы можем использовать для идентификации разделяемой памяти.это имя, которое мы можем использовать дляидентифицировать семафоры (это может быть префикс, который может использоваться для имен многих семафоров).Эти же имена должны быть использованы при вызове производителя.Программа производителя будет названа как производитель и будет вызываться со следующими параметрами:
производитель N…

Здесь N - количество производителей.Это имя входного файла для производителя X. Входной файл - это текстовый файл, хранящий целые числа.Количество вводимых нами имен входных файлов будет равно N. В файле может быть одно или несколько целых чисел.Входной файл может быть довольно большим (миллиарды целых чисел).это имя, которое мы можем использовать для идентификации общей памяти.это имя, которое мы можем использовать для идентификации семафоров.

Пример вызова программ может быть таким:in1.txt in2.txt mysmem mysemaphore

Ответы [ 4 ]

5 голосов
/ 12 ноября 2011

Вопрос в том, как синхронизировать два процесса, совместно использующих память .Вы можете использовать Семафоры Posix , но есть много других способов сделать это.

1 голос
/ 12 ноября 2011

Вы не можете просто поделиться памятью.Вы должны попросить операционную систему предоставить вам доступ к памяти, которая может быть использована другим процессом.Используемый API зависит от вашей ОС.Кроме того, даже в Linux, есть несколько способов сделать это с разными плюсами, минусами и ограничениями.Вот еще один вопрос, где обсуждаются некоторые альтернативы Shmem против tmpfs против mmap

1 голос
/ 12 ноября 2011

Просто добавьте main() к каждому из ваших модулей.Скомпилируйте каждый в отдельности, чтобы получить два разных двоичных файла и запустите их.

0 голосов
/ 12 ноября 2011

Я согласен с семафорами и общей памятью. В среде Linux я предлагаю использовать семафоры POSIX для общей памяти процесса и разделяемой памяти System V. Другой способ мог бы реализовать это так же, просто потому, что я думаю, что эти методы просты. *

...