Я создаю программу на C с базами клиент-сервер.Перенаправление stdin с FIFO (pipe names)
Я пытаюсь перенаправить stdin на именованный канал, который я создал, и мне удалось разместить клиента в трубку. На стороне сервера я открыл ту же трубку, закрыл stdin и перенаправил stdin, используя dup (также с dup2), в трубу.
Мне нужно прочитать ввод с помощью функции getline. Проблема в том, что он правильно считывает первый ввод, но получает после него только нули. Я добавлю образец к вопросу.
сервер:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
main() {
char* str;
size_t size=0;
int pshell_in;
unlink("/tmp/par-shell-in");
if(mkfifo("/tmp/par-shell-in", 0777) < 0){
fprintf(stderr, "Error: Could not create pipe\n");
exit(-1);
}
if((pshell_in = open("/tmp/par-shell-in", O_CREAT | O_RDONLY, S_IRUSR)) < 0){
fprintf(stderr, "Error: Failed to open file\n");
exit(-1);
}
dup2(pshell_in, 0);
close(pshell_in);
while(1) {
if (getline(&str, &size, stdin)<0) {
printf("Oh dear, something went wrong with getline()! %s\n", strerror(errno));
return -1;
}
printf("%s", str);
}
}
* Я знаю свою пустую причину я печатал с чтения (вместо того, чтобы перенаправлять) и печатает (нуль).
клиент:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <string.h>
#include <fcntl.h>
#define VECTORSIZE 7
int main() {
char* buf;
int pshell_in;
size_t size=0;
if((pshell_in = open("/tmp/par-shell-in", O_WRONLY, S_IWUSR)) < 0){
fprintf(stderr, "Error: Failed to open file\n");
exit(-1);
}
printf("%d\n", pshell_in);
while(1) {
if (getline(&buf, &size, stdin) < 0) {
return -1;
}
write(pshell_in, buf, 256);
}
}
- Я подозреваю, его право, потому что, если я использую чтение на стороне клиента (заменяющий O_WRONLY с O_RDWR) печатает строку, как я напечатал его.
Может ли кто-нибудь помочь мне с этим?