EXECVP系统调用是否支持IO重定向?示例写法能否合并文件输出?
execvp系统调用问题解答
问题1:execvp系统调用是否支持IO重定向?如下写法能否得到预期效果?
你给出的示例代码:
char *args[]={"cat","A.txt","B.txt",">","C.txt",NULL}; execvp(args[0],args);
- execvp本身不支持IO重定向,该写法完全无法达到你想要的效果。
>这类重定向符号是shell的专属语法,只有shell在解析命令的时候才会识别这类符号,执行对应的重定向逻辑,execvp本身没有解析这类特殊符号的功能。
问题2:上述代码是否可以将A.txt和B.txt中的数据写入C.txt?如果不可行,具体原因是什么?
- 无法实现该效果。
- 具体原因如下:
- execvp执行命令时,会把传入的args数组里除了最后一个NULL之外的所有元素,原封不动作为参数传递给要执行的程序(这里是cat)。cat收到参数后会把
>、C.txt都当成要读取的普通文件名,尝试打开读取内容后输出到标准输出,不会执行任何重定向操作。 - 如果你要用execvp实现等价的重定向效果,需要在调用execvp之前手动调整文件描述符:先以写入模式打开C.txt,拿到对应的文件描述符,调用
dup2(文件描述符, STDOUT_FILENO)把标准输出重定向到C.txt,关闭不需要的多余文件描述符,再构造char *args[]={"cat","A.txt","B.txt",NULL};调用execvp即可。
- execvp执行命令时,会把传入的args数组里除了最后一个NULL之外的所有元素,原封不动作为参数传递给要执行的程序(这里是cat)。cat收到参数后会把
内容的提问来源于stack exchange,提问作者user15161503
相关产品推荐
相关产品推荐

