2014-11-04 3 views
1

Предположим, что я работаю только с C, в среде Linux.Трубопроводы в C - Нужно ли использовать вилку?

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

Но что, если это не родитель и ребенок? Если у меня есть старый процесс, который работает, возможно ли с ним связаться с помощью функции pipe()? Этот процесс не является родителем (или каким-либо образом связанным) с моим текущим процессом, но у меня есть pid. Я ограничен файлом или сокетом для межпроцессного общения?

Есть ли способ указать pid и получать информацию от него без использования сокетов?

+0

использование очереди сообщений – radar

+0

Ваш вопрос слишком широк, вы не объясняете, что делают эти два процесса!Пожалуйста, * отредактируйте свой вопрос *, чтобы улучшить его! –

ответ

1

Или использовать fifo(7) -s, А.К.А. именованные каналы, или использовать unix(7) розетки; читайте также Advanced Linux Programming, чтобы получить дополнительные возможности. Смотрите также intro(2) & syscalls(2)

Вы также мог бы использовать некоторую разделяемую память и семафоры, см shm_overview(7) & sem_overview(7), или (как прокомментировало RADAR) очередей сообщений см mq_overview(7). Но использование signal(7) -s для IPC - это, как правило, плохая идея.

Помните, что inter-processor communication требует в целом сотрудничества и модификаций обоих процессов; другими словами, вы, вероятно, должны изменить код как своего старого A & ваших инициирующих процессов B! И вы, вероятно, не хотите, чтобы процесс A утечка информации без согласия.

BTW, вы также можете обменять память, используя mmap(2), например. на общий файл. Но вам нужна некоторая синхронизация.

также читают proc(5); через /proc/1234/ вы можете запросить некоторую информацию о том процессе 1234.

Кстати, в то время как в самом деле pipe(7) -s очень часто создаются (с использованием pipe(2)) перед вызовом fork(2) между родительскими и дочерними процессами это не является обязательным. В частности, бывают случаи, когда вы хотите, чтобы процесс выполнялся сам по себе (например, для Unix signal delivery in Qt).

1

для вашего вопроса

Но что, если это не является родителем и ребенком? Если у меня есть старый процесс , который работает, можно ли с ним связаться с помощью функции pipe() ?

Вы не сможете связаться ни с одним другим процессом, который не создан родительским процессом. Ну, технически, вам не следует позволять.

Для достижения этой функциональности вам необходимо пройти через ОС или использовать другие механизмы IPC.

Базы данных широко используются только по этой основной причине. Несколько процессов смогут читать и записывать данные в одну БД. С защитой от нескольких обновлений.