drem1lin
@drem1lin
чуть программист, чуть чуть админ...

Как сделать синхронную запись в пайп?

Всем привет, делаю двусторонний канал из двух пайпов и при тестировании заметил, что записывая данные с одной стороны получаю разбивку сообщения при приеме. например
f
OnRead2 f
ffffff
OnRead2 f
OnRead2 ffff
OnRead2 f
т.е. напечатанное превратилось в три строки.
Попробовал установить флаг O_SYNC, но ситуация не изменилась.
FIFO открывается и создается так
if(mkfifo(pipeForWriting, S_IFIFO|S_IRWXU|S_IRWXG|S_IRWXO) != 0)
    {
		if(errno==EEXIST)
			return 0;
		printf("create named pipe error = %d\n", errno); /* произошла ошибка */
	    return errno;
    }

pipeForWritingDescriptor = open(pipeForWriting, O_SYNC|O_WRONLY);


Как сделать так, что бы считывалось все сообщение целиком?
  • Вопрос задан
  • 333 просмотра
Решения вопроса 1
leahch
@leahch Куратор тега Linux
3D специалист. Dолго, Dорого, Dерьмово.
Так понятно. Вам лучше всего перейти на "сообщения" со свое структурой.
В заголовке сообщения просто ставите его длину, а уже в цикле считываете само тело до достижения длины. Таким образом вы не будете зависеть от буферов и прочей асинхронности записи.
Собственно с сокетами такая же история, да и с остальными потоками.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы