dup2和execvp在c中的使用
我正在编写一个程序,它打开两个文件(file1只读和file2只读),然后打开一个子进程,用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
替换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
不需要可靠(请参阅)。当然,现在这还远远不是问题。