счастье рядом
Привет всем неспящим

Пытаюсь на чистом СИ записать информацию в канал и считать оттуда в двух разных процессах. Почему-то записывает одно, а считывает совсем другое. Помогите разобраться, пожалуйста.
Выводит так (сначала то, что записывается, а потом то, что считалось):
вызывает подозрение в печати данных невесть откуда...
фишка в том, что в вот таком варианте, когда тоже самое с fifo, но поток один, все отлично работает, а когда разделяю на два - что-то не то уже(
Мне сказали, что проблема может быть вот в чем: "Дело в том, что вы пересылаете не сами строки, а лишь указатели на них. У дочернего процесса по этим адресам нужных строк нет."
Но я не знаю, как ее решить =/
Лучик искренности,
1.
char *string [fileSize];
char *res[fileSize];
это массивы указателей. В нём можно "поуказывать" на fileSize (который в данном случае = 25) строк, но физически эти строки в этом массиве располагаться не будут, только их адреса в памяти. Если непонятно - то прошу сюда.
Соответственно, размер записываемого (и считываемого) это уже никак не 25 строчек, а просто размер буфера - т.е filesize*sizeof(char*). В пределах одного процесса это будет работать, поскольку по считанным адресам будут строки. А вот у другого процесса - другое адресное пространство, и обращение по "чужому" указателю в лучшем случае даст просто мусор. Потому нужно записывать каждую строчку отдельно, циклом проходясь по всему массиву строк. Печать же того, что было "записано" как-то же догадались сделать правильно, вот с вызовом write нужно сделать примерно то же самое.
Читать - уже немножко сложнее, тут есть проблема в размере поступающих данных, которого вам (если делать все "па чэснаму") никто не скажет. Устанавливаем размер блока для чтения (любое симпатичное тебе число на таких маленьких объёмах данных), выделяешь пару блоков на буфер, читаешь в буфер поблочно. В случае, если данных больше, чем у нас выделено памяти - реаллоцируем (realloc) буфер на ещё пару блоков сверху. В результате - получится один большой буфер, содержащий все строки. Просто так вывести его не получится - он повсеместно содержит 0-байтыю Но можно его "подробить" в массив, используя в качестве разделителя эти самые 0-байты.
//подробно расписывать не буду - получится простыня подлиннее кода, это дело реализующего. Но идею уловить можно, как мне кажется.
2. Читать (read()) нужно в цикле пока он не вернёт <=0. 0 - в случае успешного завершения, -1 - ошибка.