2013-01-18 5 views
0

Я реализую канал с использованием общей памяти. Я должен написать и коснуться только библиотеки, а не main().Реализация трубы с использованием общей памяти

я столкнулся с проблемой:

Допустим, это main() некоторого пользователя, который использует свою библиотеку shared_memory_pipe.h:

#include "shared_memory_pipe.h" 

int main() { 
    int fd[2]; 
    shared_memory_pipe(fd); 
    if (fork()) { 
     while(1) {} 
    } 
    shared_memory_close(fd[0]); 
    shared_memory_close(fd[1]); 
} 

В этом примере мы видим, что ребенок закрывает оба его Fd-х годов, но отец застрял в бесконечном цикле и никогда не закрывает свои fd's. В этом случае моя трубка все еще должна существовать (по сравнению с случаем, когда все записи fd закрыты, или все чтение fd закрыты, или все закрыты, поэтому труба должна умереть).

Как я уже говорил, я пишу только библиотеку, (shared_memory_pipe.h). Итак, внутри библиотеки, как я могу узнать, был ли сделан fork()?

Как я могу узнать, что есть другой процесс, у которого есть конец чтения/записи для моей общей памяти, поэтому я знаю, чтобы закрыть/не закрыть мою общую память?

Я слышал что-то о команде, которая знает, что есть fork() или что-то в этом роде, но я ее не нашел, и я не знаю.

Спасибо заранее! Пожалуйста, спросите, нужна ли вам дополнительная информация.

ответ

0

Перед любой вилкой родитель может сохранить результат getpid() глобальному pid_t pid_parent.

Более поздний момент времени процесс cann тест против pid_parent с использованием getpid() снова.

Если результат getpid() отличается от pid_parent, процесс является как минимум одним fork() от родителя.

+0

Я не понял, Я не пишу 'main()', я не могу этого сделать. и если я сделаю это в библиотеке, то есть случаи, когда ребенок никогда не сможет использовать какую-либо функцию библиотеки, поэтому я никогда не мог знать, что его pid – hudac

0

Какая часть кода отвечает за закрытие fd?

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

Если у вас есть API-интерфейс библиотеки, чтобы закрыть FD, то это все, что вы можете сделать. Программа exec'ed не вызовет вашу библиотеку так или иначе.

+0

Я только что редактировал мой вопрос, потому что я не писал ' close() 'correct,' main() 'должен закрыть канал общей памяти, точно как реальный канал, после' pipe (fd) ', вы должны сделать' close (fd [0]) ',' close (fd1 [1]) ' – hudac

+0

@hudac: Хорошо, поэтому, если основной обязанностью является закрытие fd, а не библиотеки, то как ваша ответственность, когда они не закрывают fd правильно? Например, они могут закрыть один fd, но не другой. – cdarke

+0

Правильно, пользователь может делать все, что захочет ... Вопрос в том, как отслеживать открытые fd? как я могу узнать, например, если все процессы закрыли свою сторону написания конкретного fd?потому что, если все процессы закрывают свою сторону записи конкретного fd, тогда, как обычный канал, я должен удалить трубку, не так ли? – hudac

Смежные вопросы