unistd.h read () читает больше данных, чем записывается - PullRequest
0 голосов
/ 17 мая 2009

Я читаю / записываю данные из именованного канала. На стороне записи написано, что он записывает постоянные 110 байтов. Что касается чтения, то в большинстве случаев он говорит, что читает 110 байтов, что правильно, но в других случаях он читает 220 байтов или 330 байтов. Что верно в том факте, что когда я его распечатываю, он выводит одно и то же сообщение два или три раза подряд в одном и том же read () В приведенном ниже коде для чтения я делаю что-то не так с memset, чтобы очистить символ? Я не могу думать ни о каком другом способе, как он читает больше, чем пишет, если что-то не осталось в буфере.

int fd1, numread;
char bufpipe[5000];

    while(1)
    {
        fd1 = open("/tmp/testPipe", O_RDONLY);
        numread = read(fd1,bufpipe, 5000);//->this should always be 110
        if(numread > 1)
        {
            printf("READ: %i", numread); 
            bufpipe[numread+1] = '\0';
            memset(bufpipe,'\0',5001);
            close(fd1);
        }
    }

Ответы [ 3 ]

6 голосов
/ 17 мая 2009

Это:

memset(bufpipe,'\0',5001);

перезаписывается одним байтом, потому что у вас есть только 5000 байтов.

Но главная «проблема» в том, что read(..., 5000) всегда будет читать столько, сколько может, до 5000 байт - вы, похоже, предполагаете, что он будет читать только столько, сколько было написано за один раз писателем, неправда. Если записывающее устройство записывает два пакета по 110 байт между двумя чтениями, то вполне правильно, что считывающее устройство считывает 220 байт.

Если вам нужно читать только один пакет за раз, вы должны сделать свои пакеты самоописывающими. Так, например, первые четыре байта содержат количество байтов, чтобы следовать. Затем вы можете прочитать один пакет, прочитав четыре байта, преобразовав его в целое число, а затем прочитав это количество байтов данных.

1 голос
/ 17 мая 2009

Ваше предположение, что read выполнится сразу после write, неверно. Процесс записи может записать в канал пару раз, прежде чем встретится чтение. Записанные данные будут добавлены в конец буфера. Другими словами, чтение и запись не ориентированы на пакеты. Они ориентированы на поток. Это означает, что write просто добавляет данные в буфер, а read просто получает все, что ему доступно.

0 голосов
/ 17 мая 2009

Как ты синхронизируешься с писателем? Вам нужно просто прочитать то, что вы ожидаете (укажите 110 для чтения ())

...