通过管道将图像发送到C中的子进程

时间:2018-12-03 22:23:42

标签: c pipe fork display

我的程序需要做的是创建子进程,然后将其转换为dipslay程序,并通过管道将其发送到PNG图片。我想我已经接近了,但是我不知道如何通过管道发送图像。

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

int main(void)
{
    int     fd[2];
    pid_t   childpid;

    char    string[] = "";
    char    readbuffer[10000];
char    buf[10000];
FILE *fptr;

    pipe(fd);

    if((childpid = fork()) == -1)
    {
            perror("fork");
            exit(1);
    }

    if(childpid == 0)
    {
            //Child
            close(fd[1]);
    dup(fd[0]);
    execl("/usr/bin/display","display", (char *)0);
    read(fd[0], readbuffer, sizeof(readbuffer));
            exit(0);
    }
    else
    {
    //Parent
    close(fd[0]);
    dup2(fd[1],1);
    printf("Type name of the file:\n");
    scanf("%s",string);
    fptr = fopen(string, "r");
     while ( fgets(buf, sizeof(buf), fptr) != NULL) {
            write(fd[1], buf, strlen(buf));
            }

    fclose(fptr);

    }

    return(0);

1 个答案:

答案 0 :(得分:0)

首先,您需要关闭与标准输入关联的文件描述符。

close(0);

然后复制fd [0]。它应该工作。您无需在父进程中复制fd [1]。

我的程序:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>


int main()
{
  int pipe_fd[2];
  int c;
  FILE *file;


  pipe(pipe_fd);

  if(fork()==0)
    {
      //child
      close(pipe_fd[1]);
      close(0);
      dup(pipe_fd[0]);
      execl("/usr/bin/display","display", (char*)NULL);
      read(pipe_fd[0], &c, 1);
      exit(1);
    }
      // parent
      close(pipe_fd[0]);
      file=fopen("Lena2.pgm","r");
      if(file==NULL)
        printf("File error\n");
      while(!feof(file))
        {
          c=getc(file);
          write(pipe_fd[1], &c, 1);
        }
}