int todc[2], fromdc[2];
pipe(todc); pipe(fromdc);
fork();
if ({parent}) {
close(todc[0]);
close(fromdc[1]);
repeat
readline from user
convert
write(todc[1], cmd, length)
read(fromdc[0], reply)
printf to user
Client would similarly exec dc.
FILE *fp = fopen("stuff", "r");
c = getc(fp); fgets(buf, len, fp); fscanf(fp, ...)
fclose(fp);
FILE *fp = popen("ls", "r");
fgets(buf, len, fp);
pclose(fp);
fp = popen("mail admin", "w");
fprintf(fp, "Major error!\n");
pclose(fp);
pipe(p);
fork();
if (child) {
close(p[0]);
dup2(p[1],1);
close(p[1]);
execl("/bin/sh", "sh", "-c", cmd, NULL);
} else { // parent
close(p[1]);
fp = fdopen(p[0], "r");
return fp;
}