我的程序需要做的是创建子进程,然后将其转换为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);
答案 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);
}
}