FIFO Pipelining Server получает только определенную сумму

Итак, я пытаюсь реализовать базовый конвейер FIFO на C, используя mkfifo(). Вот мои классы кода:

основной.с:

int main(int argc, char *argv[]) {
char *path = "/tmp/fifo";
pid_t pid;

setlinebuf(stdout);
unlink(path);
mkfifo(path, 0600);

pid = fork();
if (pid == 0) {
    client(path);
} else {
    server(path);
}

return(0);
}

клиент.с:

void client(char *path) {

char *input;
input = (char *)malloc(200 * sizeof(char));

read(STDIN_FILENO, input, 200);

struct Message message;
message = protocol(input); //protocol simply takes an input string and formats it
char number = message.server;
char* string;
string = message.string;

int fd;

fd = open(path, O_WRONLY);
write(fd, string, sizeof(string));
printf("Client send: %s\n", string);
close(fd);


return;
}

сервер.с:

void server(char *path) {
int fd;
char *input;
input = (char *)malloc(200 * sizeof(char));

fd = open(path, O_RDONLY);
read(fd, input, sizeof(input));
printf("Server receive: %s\n", input);
close(fd);

return;
}

Теперь конвейер работает, но сервер почему-то получает только часть сообщения. Например, если мы получим следующую строку из протокола: «HELLO WORLD», мы получим следующий вывод:

Server receive: HELLO WO
Client send: HELLO WORLD

Сервер должен получить все сообщение, но это не так. Что я делаю неправильно? Спасибо за любую помощь!


person k1234    schedule 02.06.2016    source источник
comment
В server.c почему input = (char *)malloc(200 * sizeof(char));, а затем read(fd, input, MAX_BUF);, когда MAX_BUF равно 1024?   -  person Weather Vane    schedule 02.06.2016
comment
Ах, да, я пробовал разные вещи, и оба с этим MAX_BUF или с использованием sizeof(input) дали мне один и тот же результат. Думаю, я забыл изменить его обратно на что-то последовательное! ^^;   -  person k1234    schedule 02.06.2016


Ответы (1)


Я заметил, что вы пропустили обычно необходимую проверку возвращаемых значений из open и read и write. Если бы вы это сделали, вы могли бы заметить ошибку в этой строке

write(fd, string, sizeof(string));

Поскольку string является указателем, вы отправляете 8 байтов (размер указателя). Вы должны использовать strlen(string) или тот +1, в зависимости от того, нужно ли отправлять терминатор.

write(fd, string, strlen(string));

Вы повторяете ошибку в своем недавнем неразумном редактировании:

read(fd, input, sizeof(input));

Вам лучше придерживаться исходного #define и использовать его как для выделения буфера, так и для размера запроса на чтение.

person Weather Vane    schedule 02.06.2016
comment
Большое спасибо! Я все еще очень новичок в C. Использование strlen и возвращение к моему предыдущему MAX_BUF сделали свое дело!! - person k1234; 02.06.2016
comment
Пожалуйста, старайтесь избегать встроенных жестко закодированных магических чисел - всегда берите их из одного определения. - person Weather Vane; 02.06.2016