dup2和execvp在c中的使用

dup2和execvp在c中的使用,c,execvp,dup2,C,Execvp,Dup2,我正在编写一个程序,它打开两个文件(file1只读和file2只读),然后打开一个子进程,用file1替换stdin,用file2替换stdout,然后运行一些shell命令(sort,cat,tr或类似的东西)。文本必须来自stdin(file1),并写入stdout(file2)。这是我的代码。它不是一个完整的代码,只是子进程调用的函数 void childProcess(int fd[],char* arguments[]) { int f1=atoi(arguments[0]); /

我正在编写一个程序,它打开两个文件(file1只读和file2只读),然后打开一个子进程,用
file1
替换
stdin
,用
file2
替换
stdout
,然后运行一些shell命令(
sort
cat
tr
或类似的东西)。文本必须来自
stdin(file1)
,并写入
stdout(file2)
。这是我的代码。它不是一个完整的代码,只是子进程调用的函数

void childProcess(int fd[],char* arguments[])
{
  int f1=atoi(arguments[0]); //gets file descriptor number of file1
  int f2=atoi(arguments[1]);  //fd number of file2
  dup2(fd[f1],0);    //changes stdin to file1
  dup2(fd[f2],1);    //changes stdout to file2

  char* myText[1024];


 //not sure how to get the content of stdin into myText

  char*execArgs[] = {"cat",myText,NULL};

  execvp("cat",execArgs);

}
因此,我遇到的两个问题是:我不知道如何将整个
stdin(file1)
放入
myText
中,而且程序还说:-

cat: no such file or directory.

请提供帮助。

myText的内容未定义。当您将其传递到
cat
时,它将搜索具有该名称的文件(很可能无法找到,甚至可能会崩溃)。如果执行
execvp(),为什么要将
stdin
的内容复制到
myText
被调用的程序将继承当前的
stdin
,在
cat
的情况下,
tr
和朋友从那里读取输入。@dhke你是对的,除了一件事:我看不出它是如何崩溃的(除非
cat
中有bug)@Ctx:Hmm。因为我们正在替换进程映像,
execvp()
需要复制/触摸/计算它的参数(例如,复制到内核空间,然后返回)。由于
myText
不是以零结尾的,我在调用过程中看到了一个可能的segfault(但可能是
exec()
中的
EINVAL
).
cat
在这种情况下甚至不会被调用。@dhke是的,
EFAULT
是迂腐的;),但它在任何情况下都不会崩溃。@Ctx您当然是。有趣的是,segfaulting似乎是一个同样有效的选项,因为
EFAULT
不需要可靠(请参阅)。当然,现在这还远远不是问题。