exec系列文件输入

时间:2011-10-03 00:10:19

标签: c++ linux shell input exec

嘿伙计们我正在尝试用C ++编写一个shell,我在使用输入文件和exec命令的功能方面遇到了麻烦。例如,Linux中的bc shell能够执行“bc< text.txt“以批量方式计算文本中的行。我正试图用我的shell做同样的事情。有点像:

char* input = “input.txt”;
execlp(input, bc, …..)    // I don’t really know how to call the execlp command and all the doc and search have been kind of cryptic for someone just starting out.

使用exec命令是否可以实现?或者我必须逐行读取并在for循环中运行exec命令吗?

2 个答案:

答案 0 :(得分:3)

您可以打开文件然后dup2()文件描述符到标准输入,或者您可以关闭标准输入然后打开文件(这是因为标准输入是描述符0并且open()返回编号最小的可用描述符。)

 const char *input = "input.txt";
 int fd = open(input, O_RDONLY);
 if (fd < 0)
     throw "could not open file";
 if (dup2(fd, 0) != 0)  // Testing that the file descriptor is 0
     throw "could not dup2";
 close(fd);             // You don't want two copies of the file descriptor
 execvp(command[0], &command[0]);
 fprintf(stderr, "failed to execvp %s\n", command[0]);
 exit(1);

你可能想要比throw更聪明的错误处理,尤其是因为这是子进程,它是需要知道的父进程。但throw网站标记了处理错误的点。

请注意close()

答案 1 :(得分:1)

重定向正由shell执行 - 它不是bc的参数。您可以调用bash(相当于bash -c "bc < text.txt"

例如,您可以将execvp与文件参数"bash"和参数列表

一起使用
"bash"
"-c"
"bc < text.txt"