2016-06-02 3 views
0

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

main.c:

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); 
} 

client.c:

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; 
} 

server.c:

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 

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

+0

В server.c, почему 'input = (char *) malloc (200 * sizeof (char)) ;, но затем' read (fd, input, MAX_BUF); 'когда' MAX_BUF' равно 1024? –

+0

О, хорошо, я пытался различать вещи, и оба с этим MAX_BUF или с использованием sizeof (input) дали мне тот же результат. Думаю, я забыл изменить его на что-то непротиворечивое! ^^; – k1234

ответ

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 и использовать это как для выделения буфера и прочитать размер запроса.

+0

Большое вам спасибо! Я все еще очень новичок в C. Использование strlen и возвращение к моему предыдущему MAX_BUF сделали трюк! – k1234

+0

Пожалуйста, старайтесь избегать строковых закодированных магических чисел - всегда используйте их из одного определения. –

Смежные вопросы