gpt4 book ai didi

c - 如何在 while 循环中传递多个命令

转载 作者:太空宇宙 更新时间:2023-11-03 23:59:07 24 4
gpt4 key购买 nike

<分区>

假设用户在 shell say 上传递了多个命令

command 1 | command 2 | command 3 | command 4

所以我写了一个示例程序,它在 char str[] 中读取命令 1|命令 2(现在为了简单起见,我已经在程序中对命令进行了硬编码)

#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

int main()
{
char str[] = "ls -al| grep test.txt";


char *commands[10]; // Array to hold a max of 10 commands
char *semi = "|";
char *token = strtok(str, semi);
int i = 0;
while (token != NULL)
{
commands[i] = token;
++i;
token = strtok(NULL, semi);
}
int numCommands = i; // numCommands is the max number of input commands


i = 0;
while (i < numCommands)
{
printf("Command: %s\n", commands[i]);


char *args[10] = {}; // Array to hold command args
args[0] = strtok(commands[i], " ");
int tokenCounter = 0;
while (args[tokenCounter] != NULL)
{
tokenCounter++;
args[tokenCounter] = strtok(NULL, " ");
}


int childpid = fork();


if (childpid == 0)
{
if ((execvp(args[0], args)) < 0)
{
printf("Error! Command not recognized.\n");
}
exit(0);
}

else if (childpid > 0)
{
wait(&childpid);
}
else
{
printf("Error: Could not create a child process.\n");
exit(1);
}

++i;
}

return 0;
}

我知道在这种情况下我需要使用 dup2 和管道,我也学习了很多教程,但是在上面的代码中,当我在 while 循环内执行命令时,即 while (i < numCommands)然后命令被独立执行,而我想在这里实现的是,因为用户可以在 shell 上传递的命令数量可能是 n,所以我如何实现 n 个管道,我可以在 while 循环中使用这些管道来执行读写。更具体地说我想将一个命令的输出连接到管道中的其他命令。 命令行中的多个管道程序用标记“|”分隔。因此,命令行将具有以下形式:

 <program1><arglist1> | <program2><arglist2> | ... | <programN><arglistN> [&]

我在上面的程序中启动了多个进程,但在正常情况下,当我知道我应该使用多少管道时,我如何使用管道连接它们,我会构建它们并传递输入。但是这里的数字没有指定为用户可以传递多少命令。那么在这种情况下我该如何去实现多个管道。我正在寻找任何可以解决我的问题的逻辑

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com