我有一个与fifos和write()
和read()
函数有关的问题。我通过mkfifo()
函数创建fifo,然后使用fork()
生成两个进程:第一个通过write()打开并在fifo上写入;另一个打开并读取read()。 我的问题是,在标准输出写入write()
,并且read()
等待我在stdin上写入内容并按Enter键,就像scanf()
一样,因此不使用fifo。我真的不知道该怎么做,我已经尝试过任何东西,至今没有在互联网上发现任何相关问题。 我使用的是gcc编译器和Xubuntu 15.10。write()和read()不能在stdio而不是fifo上工作
过程发生器
int main (void) {
int f = mkfifo("try", S_IRUSR | S_IWUSR);
if (f < 0)
printf("mkfifo went fine\n");
else
printf("mkfifo went wrong\n");
pid_t fo = fork();
switch (fo) {
case -1:
printf("err\n");
case 0:
execlp("prova_fifo2", "prova_fifo2", NULL);
default:
execlp("prova_fifo", "prova_fifo", NULL);
}
return (0);
}
作家(又名prova_fifo)
int main (void) {
int fd;
if (fd = open("try", O_WRONLY) == -1)
printf("Error opening FIFO\n");
char buf[6];
sprintf(buf, "hello");
int writer = write(fd, buf, strlen(buf));
printf("%d", writer);
return (0);
}
阅读器(也称为prova_fifo2)
int main (void) {
int fd;
if (fd = open("try", O_RDONLY) ==-1)
printf("Errore in apertura FIFO\n");
char buf[6];
read(fd,&buf, strlen(buf)); //tried removing the "&", didn't work
printf("READ: %s", buf);
return (0);
}
注意我包括所有必要的库,代码编译和运行。我唯一的问题是上面提到的问题。
'读(FD,与BUF ,strlen(buf));'这个buff是没有意义的,aand strlen()可以做可怕的事情,如果它没有找到一个0.同样:read()*可以*读取超过实际大小的小缓冲区 – wildplasser
以'if(f <0)'开头的代码块1)如果'f'小于0,则调用mkfifo()失败。在这种情况下,调用:'perror(mkfifo failed“); exit(EXIT_FAILURE);'。因为如果函数失败,没有理由继续执行代码,并且调用perror()会输出系统认为问题是: – user3629249
当对'execlp()'的调用失败时,该调用将返回。所以每次调用'execlp()'后面应该跟一个类似的内容:'perror(“execlp failed”); exit(EXIT_FAILURE);' – user3629249