2014-03-09 4 views
0

Этот код должен печатать «Выход из« ls -l »:» и добавить результат «ls -l», но это не так ... У кого-нибудь есть ключ Что не так с этим?fork, pipe exec и dub2

#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

void readStringFromFile (int file, char * readbuffer) { 
    int nbytes = read(file, readbuffer, sizeof(readbuffer)); 
    readbuffer[nbytes] = 0; 
} 

int main(int argc, char const *argv[]) 
{ 
    int fd[2]; 
    pipe(fd); 

    if (fork()==0)//child process 
    { 
     close(fd[0]); 
     dup2(fd[1],1); 
     int retValue = execl("/bin/ls","ls","-l", NULL); 
     printf("Exec failed: retValue = %d\n",retValue); 
    } else 
    { 
     int status; 
     close(fd[1]); 
     wait(&status); 
     char readbuffer[1024]; 
     readStringFromFile(fd[0],readbuffer); 
     printf("Output from 'ls -l':\n %s", readbuffer); 
    } 
} 

ответ

2

В вашем коде sizeof(readbuffer) равно 4 в следующем фрагменте кода., Так что он читает 4 байта макс.

void readStringFromFile (int file, char * readbuffer) { 
    int nbytes = read(file, readbuffer, sizeof(readbuffer)); 
    readbuffer[nbytes] = 0; 
} 

Вы можете отправить размер буфера в качестве другого параметра, что дает:

void readStringFromFile (int file, char * readbuffer, int maxsize) { 
    int nbytes = read(file, readbuffer, maxsize); 
    readbuffer[nbytes] = 0; 
} 

и вызывать его:

readStringFromFile(fd[0], readbuffer, sizeof(readbuffer));