I would like to fork a child and connect pipes to the stdin and stdout of child. And then run the exec ./xx. After that I send 17 from parent to child and child print it. all good so far. but when I send a 17 return to parent it doesnt work. The result is : output nothing and look like wait for some input. if I remove the code “fscanf(b, “%d”, &x); ” in parent, the output is: from C 0 from p 17 I pretty confuse why I get the odd result?? Thank you
JavaScript
x
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdbool.h>
int main(int argc, char** argv) {
int fds[2], cp[2], x = 0;
pipe(fds);
pipe(cp);
int pid=fork();
// c
if (pid==0) {
close(fds[1]);
close(cp[0]);
dup2(fds[0],0);
dup2(cp[1], 1);
close(cp[1]);
close(fds[0]);
execlp("./xx", "xx", 0);
}
// p
if (pid) {
close(fds[0]);
close(cp[1]);
dup2(fds[1],1);
close(fds[1]);
FILE* a=fdopen(1, "w");
FILE* b=fdopen(cp[0], "r");
fprintf(a, "17");
fscanf(b, "%d", &x);
fprintf(stderr, "from C %d", x);
}
return 0;
}
XX
JavaScript
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdbool.h>
int main() {
int y = 0;
FILE* r=fdopen(STDIN_FILENO, "r");
fscanf(r, "%d", &y);
fprintf(stderr, "from p %d n ", y);
FILE* w=fdopen(STDOUT_FILENO, "w");
fprintf(w, "17");
return 0;
}
Advertisement
Answer
Use this code:
JavaScript
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdbool.h>
int main(int argc, char** argv) {
int fds[2], cp[2], x = 0;
pipe(fds);
pipe(cp);
int pid = fork();
if (pid==0) {
close(fds[1]);
close(cp[0]);
dup2(fds[0], 0);
dup2(cp[1], 1);
execlp("./xx", "xx", NULL);
}
if (pid > 0) {
close(fds[0]);
close(cp[1]);
FILE * a = fdopen(fds[1], "w");
FILE * b = fdopen(cp[0], "r");
fprintf(a, "17n");
fflush(a);
fscanf(b, "%d", &x);
fprintf(stderr, "from C %dn", x);
} else {
// error while fork
perror("fork"); // print error to console.
return 1;
}
return 0;
}
And xx:
JavaScript
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdbool.h>
int main() {
int y = 0;
FILE* r = stdin;
fscanf(r, "%d", &y);
fprintf(stderr, "from p %d n ", y);
FILE* w = stdout;
fprintf(w, "17n");
fflush(w);
return 0;
}
It’s working for me 🙂