Witjacie,
Pisze program tworzący łacze komunikacyjne miedzy potomkiem i rodzicem.
Problem jest taki ze w potomku chce to łącze podpiąc pod STDIN/OUT
STDIN_FILENO sie ładnie podpina, a STDOUT_FILENO juz nie . Nie ma błędu w ogóle program głupieje...
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#define MAXLINE 2048
int main(int argc,char* argv[]) {
int fd1[2],fd2[2],n,j,i=0;
pid_t pid,*tmp,ppid=getpid();
char line[MAXLINE];
memset(line,0,MAXLINE);
if(pipe(fd1) < 0 || pipe(fd2) < 0) {
printf("error in pipe(): %s\n",strerror(errno));
exit(1);
}
if( (pid = fork()) < 0) {
printf("error in fork(): %s\n",strerror(errno));
exit(1);
} else if(pid > 0) { // proces macierzysty
sleep(1);
//dwa lacza jedno do pisania, drugie do odcztu
close(fd1[0]); // zamknij odczyt
close(fd2[1]); // zamknij zapis
//fd1 lacze do pisania
//fd2 lacze do czytania
strcpy(line+i,(char*)&ppid); // zapisz swoj pid
i += sizeof(ppid);
if( write(fd1[1],line,strlen(line)) != strlen(line)) { // wyslij swoj pid
printf("error in write(): %s\n",strerror(errno));
exit(1);
}
} else { // dziecko
close(fd1[1]);
close(fd2[0]);
if(fd1[0] != STDIN_FILENO) { // podpiecie pod standardowe wejscie
if( dup2(fd1[0],STDIN_FILENO) != STDIN_FILENO) { // podpinam
printf("error in dup2(): %s\n",strerror(errno));
exit(1);
}
close(fd1[0]);
}
if(fd2[1] != STDOUT_FILENO) { // podpiecie pod standardowe wyjscie
if( dup2(fd2[1],STDOUT_FILENO) != STDOUT_FILENO) { // podpinam
printf("error in dup2(): %s\n",strerror(errno));
exit(1);
}
close(fd2[1]);
}
//teraz dziecko ma lacze utworzone z stdin/stdout
printf("czekam\n"); //TU PROGRAM W OGOLE NIE DOCHODZI !!!!!
while( n=read(STDIN_FILENO,line,MAXLINE) > 0) { // odbierz liste PID
printf("dostalem: %s\n",line);
for(j=0;j<strlen(line);j+=sizeof(pid_t)) {
tmp = (pid_t*)line;
printf("jest pid = %d\n",(int)*tmp);
}
}
}
return 0;
}
nie rozumiem dlaczego program nie dochodzi do zaznaczonego miejsca. Czy ktoś jest w stanie pomoc ?