如何将 input/output 重定向放入你新创建的 c shell?
How to put input/output redirection in your newly-created c shell?
我想知道是否有人可以指出正确的方向来说明如何做到这一点?例如,如果我写 "ls > contents.txt",我希望将 ls 的输出写入 content.txt。
这是我目前所掌握的。
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <ctype.h>
void parse(char *line, char **argv)
{
while (*line != '[=12=]') {
while (*line == ' ' || *line == '\t' || *line == '\n')
*line++ = '[=12=]';
*argv++ = line;
while (*line != '[=12=]' && *line != ' ' &&
*line != '\t' && *line != '\n')
line++;
}
*argv = '[=12=]';
}
void execute(char **argv)
{
pid_t pid;
int status;
if ((pid = fork()) < 0) {
printf("*** ERROR: forking child process failed\n");
exit(1);
}
else if (pid == 0) {
if (execvp(*argv, argv) < 0) {
printf("*** ERROR: exec failed\n");
exit(1);
}
}
else {
while (wait(&status) != pid)
;
}
}
void main(char *envp[])
{
char line[1024];
char *argv[64];
while (1){
printf("shell>>");
gets(line);
printf("\n");
parse(line, argv);
if (strcmp(argv[0], "exit")==0)
exit(0);
execute(argv);
}
}
您将需要:
- 在传递的命令中检查
> [filename]
- 如果有,则打开相关文件进行输出,使用
dup2
将得到的fd附加到fork进程的stdout
这应该足以为您指明正确的方向。
在测试 pid==0 和 运行 execvp() 之前,您需要这样的代码:
int fd=open(outputfile,O_WRONLY|O_CREAT);
dup2(fd,1);
这实际上会将 execvp() 程序 运行 的标准输出设置为这个新文件。您将必须修改解析代码以查找“>”并将其后的内容解析为文件名并存储在输出文件中。
您还需要进行一些额外的检查以确保新文件可以正常打开等。
我想知道是否有人可以指出正确的方向来说明如何做到这一点?例如,如果我写 "ls > contents.txt",我希望将 ls 的输出写入 content.txt。
这是我目前所掌握的。
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <ctype.h>
void parse(char *line, char **argv)
{
while (*line != '[=12=]') {
while (*line == ' ' || *line == '\t' || *line == '\n')
*line++ = '[=12=]';
*argv++ = line;
while (*line != '[=12=]' && *line != ' ' &&
*line != '\t' && *line != '\n')
line++;
}
*argv = '[=12=]';
}
void execute(char **argv)
{
pid_t pid;
int status;
if ((pid = fork()) < 0) {
printf("*** ERROR: forking child process failed\n");
exit(1);
}
else if (pid == 0) {
if (execvp(*argv, argv) < 0) {
printf("*** ERROR: exec failed\n");
exit(1);
}
}
else {
while (wait(&status) != pid)
;
}
}
void main(char *envp[])
{
char line[1024];
char *argv[64];
while (1){
printf("shell>>");
gets(line);
printf("\n");
parse(line, argv);
if (strcmp(argv[0], "exit")==0)
exit(0);
execute(argv);
}
}
您将需要:
- 在传递的命令中检查
> [filename]
- 如果有,则打开相关文件进行输出,使用
dup2
将得到的fd附加到fork进程的stdout
这应该足以为您指明正确的方向。
在测试 pid==0 和 运行 execvp() 之前,您需要这样的代码:
int fd=open(outputfile,O_WRONLY|O_CREAT);
dup2(fd,1);
这实际上会将 execvp() 程序 运行 的标准输出设置为这个新文件。您将必须修改解析代码以查找“>”并将其后的内容解析为文件名并存储在输出文件中。 您还需要进行一些额外的检查以确保新文件可以正常打开等。