我正在创建一个带有服务器-客户端基础的 C 程序。
我一直在尝试将标准输入重定向到我创建的命名管道,并且我已经设法将客户端写入管道。在服务器端,我打开了相同的管道,关闭了标准输入并使用 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);
}
}
- 我怀疑它是对的,因为如果我在客户端使用 read(用 O_RDWR 替换 O_WRONLY),它会在我输入字符串时打印它。
谁能帮我解决这个问题?