После разветвления потомка и dub2 () - передача его дескриптора stdin в конец чтения канала (его конец записи находится в родительском процессе), чтение с чтением (0, ...) (на основе дескриптора) работает хорошо. Но чтение с помощью fgets (stdin, ...) (основанное на потоке) не работает. Почему?
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main(){
char string[]="MY TEST STRING";
pid_t pid;
int bufSize=80;
char rBuf[bufSize];
int downlink[2], wrlen=0, rdlen=0, status;
memset(rBuf,0,bufSize);
if (pipe (downlink) == -1){
printf("Error with pipe()\n");
exit(4);
}
pid=fork();
if (pid>0){ //parent
wrlen=wrlen+write(downlink[1], string, strlen(string)+1);
//dprintf(downlink[1],"%s", string);
sleep(6);
}
else if (pid == 0){ // child
dup2(downlink[0],STDIN_FILENO);
//rdlen=read(downlink[0], rBuf, bufSize); //works
//rdlen=read(STDIN_FILENO, rBuf, bufSize); //works
//scanf("%s", rBuf);fflush(stdin); //doesn't work, reads up to first blank
//scanf(stdin,"%s", rBuf);fflush(stdin); //doesn't work, reads up to first blank
fgets(rBuf, bufSize, stdin);fflush(stdin); //doesn't work
printf("c: %s", rBuf), fflush(stdout);
//status =execl("/usr/bin/octave","octave","--no-gui",NULL);
//status =execl("/usr/bin/man","man",NULL);
//printf("c: status%d", status), fflush(stdout);
}
else{ //error
printf("Error with fork()\n");
exit(4);
}
return 0;
}
В этом коде дочерний элемент fork () должен читать из stdin (который dub2 () ed в downlink [0] (= конец чтения канала из записи родителя)) и printf () для вывода полученного contets.
Если чтение происходит с помощью read () (на основе дескриптора), все работает нормально. При чтении с помощью fgets () или scanf () (на основе потока) данные не печатаются.
Что мне здесь не хватает?