Я собираю серверный процесс, который получает данные из именованного канала и возвращает некоторый вывод.C, возможно ли заблокировать процесс до тех пор, пока труба не будет открыта снова?
Как известно, когда труба открыта для чтения, она блокирует процесс, пока другой процесс не откроет трубу для записи. (. Если флаг NONBLOCK не установлен) Когда другой процесс открывает трубу и записывает на него, мы можем получить вход, как это:
...
opened_pipe = fopen(argv[1], "r")
while(1)
{
if (fgets(readbuf, FIFO_READLEN, opened_pipe) != NULL)
{ \\ process the input from the writer }
else
{
\\ this is the branch when the writer closed his end of the pipe and reader gets EOF
\\ usually one exits here
\\ but I would like to freeze the process and wait until another writer comes
\\ (like a server-like application would do)
}
}
Но когда писатель выходит этот while
переходит в бессмысленную петлю. Было бы лучше, если бы читатель вернулся в исходное состояние - процесс блокируется до тех пор, пока труба не будет снова подключена на другом конце. Можно ли это сделать?
PS
Я попытался создать фиктивный писателя в моей программе, которая открывает ту же трубу, как w
и держит его открытым в петле в fgets
все время. Но это не сработало для меня. Может, я ошибся. Можно ли вытащить этот трюк?
Также можно было постоянно закрывать и снова открывать трубу внутри while
. Но я хочу использовать либо pipe
, либо stdin
как входной поток. Было бы лучше относиться к ним одинаково в программе. Итак, можно ли снова открыть поток stdin
через fopen
с некоторым "stdin"
имени файла?
Если вы получаете в петлю, когда выходит писатель, это означает, что вы не правильно тестирование для EOF и выхода из цикла. – Barmar
@Barmar yep, я не выхожу из цикла на EOF, так как я хочу подождать, пока придет другой писатель. – xealits
Рассмотрите возможность использования сокета 'AF_LOCAL' вместо именованного канала. API сложнее, но вы получаете целую кучу преимуществ, в том числе: ваша текущая проблема Just Goes Away; вы можете с уверенностью говорить с несколькими клиентами одновременно; и как только вы это сделаете, прием соединений по сети - это еще один шаг. – zwol