execvp失败:没有这样的文件或目录

时间:2015-04-02 11:30:24

标签: pipe fork fopen execvp dup

我在C中编写一个从文件中读取的程序(例如,在我的.c源文件的同一文件夹中名为ffff的文件):这个文件包含两个命令:

ls -l
tac

我的程序打开这个文件,读取命令和相关参数,并使用管道显示我的相同输出

ls -l | tac

我使用过get行,我曾想过使用execvp,但输出是

  

execvp错误:没有这样的文件或目录。

你能帮帮我吗?这是我的代码:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <error.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
 int mypipe[2];
 FILE *stream;
 char *line=NULL;
 size_t len=0;
 ssize_t read;

 /*controllo il numero degli argomenti passati*/
 if(argc != 2){
 fprintf(stderr, "no such arguments \n");
 exit(1);
 }

/*apro il file in sola lettura*/
stream=fopen(argv[1], "r");
if(stream==NULL){
   exit(EXIT_FAILURE);
}

/*apro la pipe*/
if(pipe(mypipe) == -1){
   fprintf(stderr, "Error pipe\n");
   exit (1);
}

if(fork()==0){
   close(1); /*chiudo lo stdout*/
   dup(mypipe[1]); /*rimpiazzo lo stdout con la pipe*/
   close(mypipe[0]); /*chiudo la read della pipe*/
   close(mypipe[1]);

   read=getline(&line, &len, stream);

   execvp(argv[1], &line);
   perror("execvp failed");
   exit (1);
}
if(fork()==0){
   close(0); /*chiudo lo stdin*/
   dup(mypipe[0]); /*rimpiazzo lo stdin con la pipe read*/
   close(mypipe[1]); /*chiudo la write della pipe*/
   close(mypipe[0]);

   read=getline(&line, &len, stream);
   execvp(argv[1], &line);
   perror("execvp 2 failed");
   exit (1);
}
close(mypipe[0]);
close(mypipe[1]);
wait(0);
wait(0);
free(line);
fclose(stream);
exit (0);
}

0 个答案:

没有答案