名前なしパイプ(2)
パイプの仕組みについては名前なしパイプ(1)へ
ここでは, パイプを用いて足し算を行うプログラムやります.
#include<stdio.h>
#include<stdlib.h> // exit
#include<string.h> // strlen
#include<unistd.h> // fork
void error_message(const char *name);
int main(int argc, char **argv)
{
pid_t pid;
int na, nb, nc;
int pa[2], pb[2];
char buff[32], result[32];
if(pipe(pa) == EOF || pipe(pb) == EOF)
error_message("pipe");
if((pid = fork()) == EOF)
error_message("fork");
else if(pid == 0) { //child process
close(pa[1]);
close(pb[0]);
if(read(pa[0], buff, 32) == EOF)
error_message("read");
na = atoi(buff);
if(read(pa[0], buff, 32) == EOF)
error_message("read");
nb = atoi(buff);
nc = na + nb;
sprintf(result, "%d", nc);
if(write(pb[1], result, strlen(result) + 1) == EOF)
error_message("write");
printf("Child Process(PID:%d) Send Answer...\n", getpid());
close(pa[0]);
close(pb[1]);
}
else {
close(pa[0]);
close(pb[1]);
printf("Parent Process(PID:%d)\n", getpid());
printf("NumA:");
fgets(buff, 32, stdin);
if(write(pa[1], buff, strlen(buff) + 1) == EOF)
error_message("write");
printf("NumB:");
fgets(buff, 32, stdin);
if(write(pa[1], buff, strlen(buff) + 1) == EOF)
error_message("write");
if(read(pb[0], result, 32) == EOF)
error_message("read");
printf("Answer = %s\n", result);
close(pa[1]);
close(pb[0]);
}
return 0;
}
void error_message(const char *name) {
perror(name);
exit(EXIT_FAILURE);
}
$ ./sc
Parent Process(PID:25778)
NumA:12
NumB:34
Child Process(PID:25779) Send Answer...
Answer = 46