2017-10-27 12 views
0

次のコードを実行すると、 "grep:(標準入力):不正なファイル記述子"が表示されます。どんな考え?プログラムはあなたのホームディレクトリを表示するはずです。ありがとう!"grep:(標準入力):不正なファイル記述子"を示すホームディレクトリを出力するCプログラム

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

int main(void) { 
pid_t childpid; 
int fd[2]; 

if(pipe(fd) == -1) { /* setup a pipe */ 
    perror("Failed to setup pipeline"); 
    return 1; 
} 
if((childpid = fork()) == -1){ /* fork a child */ 
    perror("Failed to fork a child"); 
    return 1; 
} 
if(childpid == 0){ /* env is the child */ 

    if(dup2(fd[1],STDOUT_FILENO)==-1) 
     perror("Failed to redirect stdout of env"); 
    else if(close(fd[0] == -1)) /* close unused file descriptor */ 
     perror("Failed to close extra pipe descriptors on env"); 
    else { 
     execl("/usr/bin/env", "env", NULL); /* execute env */ 
     perror("Failed to exec env"); 
    } 
    return 1; 
} 
if(dup2(fd[0],STDIN_FILENO)==-1) 
/*grep is the parent*/ 
    perror("Failed to redirect stdin of grep"); 
else if(close(fd[1]==-1)) 
    perror("Failed to close extra pipe file descriptors on grep"); 
else { 
    execl("/bin/grep", "grep", "HOME", NULL); /*execute "grep HOME"*/ 
    perror("Failed to exec grep"); 
} 
return 1; 
} 
+0

最初のテストでは、if(pipe(fd [0] )== -1){}? fdのアドレスが適切な記述子ではないので、 –

+0

'grep HOME'は正確に何をしますか?そこにファイル名がありませんか? – Serge

答えて

0

エラーが論文2行である:

else if(close(fd[0] == -1)) 
... 
else if(close(fd[1]==-1)) 

それは次のようになります。

else if(close(fd[0]) == -1) 
... 
else if(close(fd[1]) == -1) 

それ以外の場合はHOMEのenvが外部プログラムを実行することなく実現することができます行き方:

#include <stdio.h> 
#include <string.h> 

int main(int argc, char **argv, char** envp) 
{ 
    char** env; 
    for (env = envp; *env != 0; env++) 
    { 
     char* thisEnv = *env; 
     if (strncmp(thisEnv, "HOME=", 5) == 0) 
     { 
      printf("%s\n", thisEnv + 5); 
      break; 
     } 
    } 
    return(0); 
} 
+0

'#include 'と 'const char * home = getenv(" HOME ");'はどうですか? –

関連する問題