FIFO 流水线服务器只接收一定数量
FIFO Pipelining Server only receiving certain amount
所以我正在尝试使用 mkfifo() 在 C 中实现基本的 FIFO 管道。
到目前为止,这是我的代码 类:
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
服务器应该会收到完整的消息,但实际上并没有。我究竟做错了什么?感谢您的帮助!
我注意到您忽略了通常对 open
和 read
和 write
中的 return 值进行必要的检查。如果你有,你可能已经注意到这一行中的错误
write(fd, string, sizeof(string));
因为string
是一个指针,你发送的是8个字节(指针的大小)。你应该使用strlen(string)
或者那个+1
,取决于是否需要发送终结符。
write(fd, string, strlen(string));
您在最近的不明智编辑中重蹈覆辙:
read(fd, input, sizeof(input));
您最好坚持使用原始 #define
并将其用于缓冲区分配和读取请求大小。
所以我正在尝试使用 mkfifo() 在 C 中实现基本的 FIFO 管道。 到目前为止,这是我的代码 类:
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
服务器应该会收到完整的消息,但实际上并没有。我究竟做错了什么?感谢您的帮助!
我注意到您忽略了通常对 open
和 read
和 write
中的 return 值进行必要的检查。如果你有,你可能已经注意到这一行中的错误
write(fd, string, sizeof(string));
因为string
是一个指针,你发送的是8个字节(指针的大小)。你应该使用strlen(string)
或者那个+1
,取决于是否需要发送终结符。
write(fd, string, strlen(string));
您在最近的不明智编辑中重蹈覆辙:
read(fd, input, sizeof(input));
您最好坚持使用原始 #define
并将其用于缓冲区分配和读取请求大小。