c - 使用指针在 argv1 中存储命令行参数时出错

标签 c linux exec posix system-calls

当用户输入多个命令时,我正在尝试实现一个 shell 和命令提示符,然后我希望将这些命令存储在 argv1 数组如下

argv1[0]="ls -al"  
argv1[1]=command 2 with arguments  
argv1[2]=command 3 with arguments

下面是我写的

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_LEN 1024

int main()
{
        char line[BUFFER_LEN];  //get command line
        char *argv[100];        //user command
        char **argv1[10];       //user command
        int n = 0;
        int argc;
        fgets(line, BUFFER_LEN, stdin);
        char *token;            //split command into separate strings
        token = strtok(line, " ");
        int i = 0;
        while (token != NULL) {
                argv[i] = token;
                token = strtok(NULL, " ");
                i++;
        }
        argv[i] = NULL;         //set last value to NULL for execvp
        argv1[n] = argv;        //we are storing commands in format argv1={"ls -al","wc","tee"}
        n++;                    //for argv1 tracking
        printf("value in argv1 is %s\n", argv[n - 1]);
        argc = i;               //get arg count
        for (i = 0; i < argc; i++) {
                printf("%s\n", argv[i]);        //print command/args
        }

}

我想要这个带有参数的完整命令进入 argv1[0] 怎么办
这。这是我想不到的。

我想做这样的事情

int
main(int argc, char *argv[])
{
        char *ls[] = {"ls", "-al", NULL};
        char *rev[] = {"rev", NULL};
        char *nl[] = {"nl", NULL};
        char *cat[] = {"cat", "-e", NULL};
        char **cmd[] = {ls, rev, nl, cat, NULL};

        pipeline(cmd);
        return (0);
}
~

在管道函数中,我将一个接一个地传递命令,以便在 while 循环中执行,同时打开多个管道和文件描述符。这将替换 execlp 调用中从 stdout 到 while 循环中的管道的输出,原始代码中的命令进来了 argv[0]=ls , argv[1]=-al, 我想在哪里实现
some_pointer=argv[0]+argv[1]
这里一些指针是我将在主函数管道中传递的命令 即 pipeline(somepointer),其余代码将在 pipleine 函数中使用参数传递的完整命令执行,这就是我想要实现的,如何实现是我无法理解的。 在实际实现中,我将通过 fgets 从用户那里获取输入,而不是我上面提到的字符数组 *ls、*nl 等。

最佳答案

您将需要使用 argvargc。这是我根据您的尝试迅速做出来的东西。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_LEN 256

int main(int argc, char *argv[])
{
  /* Command and arguments */
  char *cmd = NULL;
  char args[argc][BUFFER_LEN] ;

  /* Print command */
  printf("Command was: %s. ", argv[1]);

  /* Return early if no arguments */
  if(argc == 2) return 1;

  /* Copy arguments */
  for(int i=2; i<argc; i++)
  {
    strncpy(args[i], argv[i], sizeof(argv[i]));
  }

  /* Print args */
  for(int j=2; j<argc; j++)
  {
    printf("Arg %d is %s ", j, argv[j]);
  }

  return 0;
}

示例:

$ ./test ls
Command was: ls.

$ ./test ls -al
Command was: ls. Arg 2 is -al

关于c - 使用指针在 argv1 中存储命令行参数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52056293/

相关文章:

c - 数组未按应有的方式随机化,且值为负数

c - 数组类型具有不完整的元素类型

linux - Bash 脚本在文件中传递

linux - 当实用程序 w3m 的进程运行时,脚本有时会阻塞

c - 通过 C exec() 执行 IPtables

linux - execl找不到命令怎么办?

python - 为什么使用 timeit 或 exec 函数时,不会在提供的全局命名空间中搜索函数内的变量?

c - 使用 fscanf 逐行读取

linux - 如果进程自行终止,是否保证 kill() 函数在信号处理程序完成之前不会返回?

c - 使用 C 中的子例程对并行数组进行排序的最佳或最有效的方法?