带有FIFO

时间:2016-04-29 03:21:05

标签: c pipe fork gnu named-pipes

我有最艰难的时间完成这项任务。所以这个作业我有两个孩子(两个独立的程序),他们必须写入父(主)。父母必须从孩子那里读取两个数据,然后将其打印出来。我必须使用命名管道。那么我的FIFO一直给我“USAGE:NAMEPIPECLIENT [String]”消息,我不知道为什么。顺便说一句,消息是在客户端。此外,如果有人可以指出我如何使用叉子与多个孩子在一个非常感谢的单独文件上的良好方向。 提前致谢!使用GNU C

我的读者

#include<unistd.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<linux/stat.h>
#define FIFO_FILE "MYFIFO"         //default is current directory
int main(void){
  FILE *fpoint;
  char readbuffer[80];
  int again = 1;
  mknod(FIFO_FILE, S_IFIFO | 0666, 0);
  while(again){
    fpoint = fopen(FIFO_FILE, "r");
    fgets(readbuffer, 80, fpoint);
    printf("recevived string: %s\n, readbuffer");
    fclose(fpoint);
    if(strcmp(readbuffer, "stop") == 0 ) again = 0;
    return(0);
  }//exit main
}

我的作家

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/stat.h>
#include<linux/stat.h>
#define FIFO_FILE "MYFIFO"
int main(int argc, char *argv[]){
  FILE *fpoint;
  int again =1;
  char strIn[80] = "Use message from command line";
  if(argc !=2){
    printf("USAGE: NamedPipeClient[string]\n");
    exit(1);
  }
  strcpy(strIn, argv[1]);
  while(again == 1){
    if((fpoint = fopen (FIFO_FILE, "w")) == NULL){
      perror("fopen");
      exit(1);
    }
    fputs(strIn, fpoint);
    fclose(fpoint);
    printf("Enter message to send: ");
    scanf("%s", strIn);
    again = strcmp(strIn, "Stop");
  }

  if((fpoint = fopen(FIFO_FILE, "w")) == NULL){
    perror("fopen");
    exit(1);
  }

  fputs(strIn,fpoint);
  fclose(fpoint);
  return(0);
}

1 个答案:

答案 0 :(得分:0)

以下是编写过程的广泛修正版本

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
//#include<sys/stat.h>
//#include<linux/stat.h>

#define FIFO_FILE "MYFIFO"

int main(int argc, char *argv[])
{
    if(argc !=2)
    {
        printf("USAGE: NamedPipeClient[string]\n");
        exit(1);
    }

    FILE *fpoint;
    if((fpoint = fopen (FIFO_FILE, "w")) == NULL)
    {
        perror("fopen");
        exit(1);
    }

    char strIn[80];
    strcpy(strIn, argv[1]);


    int again =1;
    while(again == 1)
    {
        fputs(strIn, fpoint);

        printf("Enter message to send: ");
        scanf("%79s", strIn);
        again = strcmp(strIn, "Stop");
    }

    fputs(strIn,fpoint);
    fclose(fpoint);
    return(0);
}

这是只读取一个字符串的主要原因:

while(again)
{
    fpoint = fopen(FIFO_FILE, "r");
    fgets(readbuffer, 80, fpoint);
    printf("recevived string: %s\n, readbuffer");
    fclose(fpoint);
    if(strcmp(readbuffer, "stop") == 0 ) again = 0;
    return(0);
}

请注意,只有一次通过循环后,函数才会返回。

推荐:

while(again)
{
    fpoint = fopen(FIFO_FILE, "r");
    fgets(readbuffer, 80, fpoint);
    printf("recevived string: %s\n, readbuffer");
    fclose(fpoint);
    if(strcmp(readbuffer, "stop") == 0 ) again = 0;
}

return 0;

注意:return不是函数,(类似于sizeof不是函数),因此不需要parens。

注意:不断打开和关闭FIFO不是一个好主意。

建议只在任何一个过程中打开一次。

建议在任何一个过程中只关闭一次。

调用fopen()时,请务必检查返回的值以确保操作成功。