Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fifo[c]培训_C_Fifo - Fatal编程技术网

Fifo[c]培训

Fifo[c]培训,c,fifo,C,Fifo,为了个人对Fifo的兴趣和C语言程序的开发,我坚持做这个练习,显然我犯了很大的错误。已创建Fifo,但内部没有流量,必须依赖Fifo的保护/关闭/打开机制。请帮忙 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <ctype.h> #include <sys/types.h> #include <sys/stat.h> #include

为了个人对Fifo的兴趣和C语言程序的开发,我坚持做这个练习,显然我犯了很大的错误。已创建Fifo,但内部没有流量,必须依赖Fifo的保护/关闭/打开机制。请帮忙

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc, char** argv)
{
  int c;
  int fi;
  int fo;
  int stat;
  int pid;
  fprintf(stderr, "Fifo...\n");

  if (mkfifo("FifoA", 0666)==-1) {
    exit(1);
  }

  if (mkfifo("FifoB", 0666)==-1) {
    exit(1);
  }

pid = fork();

  switch (pid) {
  case 0:

  if((fo=open("FifoA",O_RDONLY))==-1)
    {
       perror("error FifoA");
       exit(1);
    }

    close(fi); 
    while (read(fo, &c, 1)>0) {

      c = toupper(c);
      fputc(c,stdout);   
}
    break;
  case -1: 
    fprintf(stderr, "Fork error\n");
    exit(1);
  default:

  if((fi=open("FifoB",O_WRONLY))==-1)
    {
       perror("error FifoB");
       exit(1);
    }
    close(fo); 
    while ((c = fgetc(stdin))!=EOF) {
      write(fi, &c, 1);
    }
    close(fi);
    wait(&stat);
    break;
  }

  return 0; 
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
INTC;
国际金融机构;
int-fo;
int stat;
int-pid;
fprintf(标准“Fifo…\n”);
如果(mkfifo(“FifoA”,0666)=-1){
出口(1);
}
如果(mkfifo(“FifoB”,0666)=-1){
出口(1);
}
pid=fork();
开关(pid){
案例0:
如果((fo=打开(“FifoA”,仅限O_RDONLY))=-1)
{
perror(“错误FifoA”);
出口(1);
}
关闭(fi);
while(读(fo,&c,1)>0){
c=toupper(c);
fputc(c,stdout);
}
打破
案例1:
fprintf(stderr,“Fork error\n”);
出口(1);
违约:
如果((fi=打开(“FifoB”,仅限O_WRONLY))=-1)
{
perror(“错误FifoB”);
出口(1);
}
关闭(fo);
而((c=fgetc(stdin))!=EOF){
写入(fi和c,1);
}
关闭(fi);
等待(&stat);
打破
}
返回0;
}

fork()
之后打开fifo,在子级中使用
O_RDONLY
,在父级中使用
O_WRONLY
。这样,fifo就可以知道其两端是开放的,并开始通信。记住,FIFO是单向的,
O_RDWR
没有意义

最后一个问题是,您创建了两个不同的FIFO,并希望它们能够相互对话

if((fo=open("FifoA",O_RDONLY))==-1)
//...
if((fi=open("FifoB",O_WRONLY))==-1)
应该是

if((fo=open("FifoA",O_RDONLY))==-1)
//...
if((fi=open("FifoA",O_WRONLY))==-1) 

先进先出有两面性。一个进程从一侧写入,另一个进程从另一侧读取。如果您的唯一目标是编写和读取程序,则只需要一个fifo。

谢谢您更改了它,但在标准输出中仍然没有任何更改。@MagnatSony您混淆了家长和孩子。而(read(fo,&c,1)>0)可能没有完全像您期望的那样;read返回0而不是-1以指示EOF。所以while检查是正确的。需要两个Fifo。为什么你认为需要两个Fifo?请更充分地练习,然后孩子打开Fifo进行书写(
O_WRONLY
),然后从中读取?父对象打开进行读取,然后写入?这看起来不对。