Отправка изображения через канал в дочерний процесс в C - PullRequest
0 голосов
/ 04 декабря 2018

Моя программа должна создать дочерний процесс, затем преобразовать его в программу 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 голосов
/ 12 декабря 2018

Сначала необходимо закрыть дескриптор файла, связанный со стандартным вводом.

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);
        }
}
...