【发布时间】:2021-02-08 03:41:39
【问题描述】:
据我所知,有很多关于管道和文件重定向的信息。但我找不到任何关于同时进行管道和文件重定向的具体内容。如果有类似的东西我可能错过了,如果你不介意的话,请给我链接。
我想要做的是在 shell 中执行一个命令,例如 ls -l | grep total > test.txt,以便 grep 从 ls -l 获取总数并将其输入到 test.txt。
按照我的程序设置方式,所有内容都被分解为 if() 逻辑以确定使用哪种符号。这是我只为一个管道工作的,而且只为一个重定向工作。当我收到| 和> 时,我对如何继续操作有点困惑。如何将两者结合起来?
else if(pipey && !redirect)
{
char main_str[1024];
char pipe_str[1024];
char *left_args[100] = {NULL};
char *right_args[100] = {NULL};
strcpy(main_str, string);
int fd[2];
char *token = strchr(main_str, '|');
*token = '\0';
token++;
while(*token == ' ')
{
token++;
}
strcpy(pipe_str, token);
int i = 0;
for(token = strtok(main_str, " \n"), i = 0; token; token = strtok(NULL, " \n" ), ++i)
{
left_args[i] = token;
}
i = 0;
for(token = strtok(pipe_str, " \n"), i = 0; token; token = strtok(NULL, " \n" ), ++i)
{
right_args[i] = token;
}
if(pipe(fd) == -1)
{
return 2;
}
c1_pid = fork();
if(c1_pid < 0)
{
return 3;
}
if(c1_pid == 0)
{
dup2(fd[1], STDOUT_FILENO);
close(fd[0]);
close(fd[1]);
execvp(left_args[0], left_args);
}
c2_pid = fork();
if(c2_pid < 0)
{
return 4;
}
if(c2_pid == 0)
{
dup2(fd[0], STDIN_FILENO);
close(fd[0]);
close(fd[1]);
execvp(right_args[0], right_args);
}
close(fd[0]);
close(fd[1]);
waitpid(c1_pid, NULL, 0);
waitpid(c2_pid, NULL, 0);
}
// A single redirect given by user
else if(!pipey && redirect)
{
char main_str[1024];
char pipe_str[1024];
char *left_args[100] = {NULL};
char *middle_args[100] = {NULL};
char *right_args[100] = {NULL};
strcpy(main_str, string);
char *token = strchr(main_str, '>');
*token = '\0';
token++;
while(*token == ' ')
{
token++;
}
strcpy(pipe_str, token);
int i = 0;
for(token = strtok(main_str, " \n"), i = 0; token; token = strtok(NULL, " \n" ), ++i)
{
left_args[i] = token;
}
i = 0;
for(token = strtok(pipe_str, " \n"), i = 0; token; token = strtok(NULL, " \n" ), ++i)
{
right_args[i] = token;
}
c1_pid = fork();
if(c1_pid < 0)
{
return 5;
}
if(c1_pid == 0)
{
int file = open(right_args[0], O_WRONLY | O_CREAT, 0777);
if(file == -1)
{
return 6;
}
dup2(file, STDOUT_FILENO);
execvp(left_args[0], left_args);
close(file);
}
waitpid(c1_pid, NULL, 0);
}
再次,我只是想知道如何获取我目前拥有的东西,并将其应用于两个符号是否同时出现。所有解析的东西都很好,只是管道和复制的东西我有点不确定。
【问题讨论】:
标签: c pipe io-redirection dup