嘿伙计们我正在尝试用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命令吗?
答案 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"