我目前正在用C ++创建自己的简单shell来实现管道,< ,>和>>不使用系统重定向。
我的所有实现都有效,但只有一个。我的标准输入重定向实现遇到了分段错误。示例:cat < file.txt
我的shell代码在另一个方法中解析提示输入(argv / argc)并调用IO重定向方法。每个重定向功能都有自己的方法。
我的stdin IO重定向方法将double char指针命令和double char指针文件作为参数。
void redirect(char** cmd, char** file) {
//declare variables
int fd;
char c;
pid_t pid;
fd = open(file[0], O_RDWR | O_CREAT, 0666);
//opens if no error
if (fd < 0) {
printf("Error: %s\n", strerror(errno));
exit(1);
}
dup2(fd, 0);
execvp(cmd[0], cmd);
perror(cmd[0]); /* execvp failed */
exit(1);
}
我的shell程序编译并成功运行。但是,当我输入:
cat < file.txt
分段错误(核心转储)
我的其他重定向IO实现具有相同的参数传递和工作,所以我认为我的stdin&#34;&lt;&#34;方法执行不正确。
作品
我真的很感激任何澄清。在研究dup2
和execvp
论坛后,我有点困惑。请告诉我我的方法实现是否有问题。
主要方法
373 //main method
374 int main() {
375 char *argv[ARGSMAX], *p1[ARGSMAX], *p2[ARGSMAX];
376 Pipeline pipe_redirect;
377 int argc;
378 //gets present working directory
379 char *name = NULL;
380 size_t size = 0;
381 name = getcwd(name,size);
382 // prompt until user quits
383 while (true) {
384 cout << "1730sh:" << name << "$ ";
385
386 //read user input
387 argc = readInput(argv);
388
389 //parse input
390 pipe_redirect = parse(argc, argv, p1, p2);
391 if (pipe_redirect == PIPE)
392 pipeD(p1, p2);
393 else if (pipe_redirect == APPEND)
394 append(p1, p2);
395 else if (pipe_redirect == TRUNCATE)
396 redirect(p1,p2);
397 else if(pipe_redirect == TRUNCOUT)
398 truncOut(p1,p2);
399 else if(pipe_redirect == ETRUNCATE)
400 eTruncate(p1,p2);
401 else if(pipe_redirect == EAPPEND)
402 eAppend(p1,p2);
403 else
404 runP(argc, argv);
405
406 // set argv to null
407 for (int i=0; i<argc; i++)
408 argv[i] = NULL;
409 }
410 return 0;
411 }