Разделение аргументов в массиве argv с помощью разделителя - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь написать программу, в которой мне нужно выполнить 2 программы с помощью системного вызова exec ().

2 имени программы предоставляются входом argv следующим образом: ./ forkexec programname parameterlist;список параметров программы Итак, я должен разделить это на двоеточие, чтобы пояснить, что я имею в виду, я сделаю пример.

. / forkexex ls -l -a / tmp \;ls -l -a / bin

Так что я думаю, что мне нужно 2 массива, верно? И я делаю это с помощью strtok?

Ответы [ 2 ]

5 голосов
/ 08 ноября 2019

Каждый параметр предоставляется как отдельный элемент argv.

argc    = 7
argv[0] = "./forkexec"
argv[1] = ";"
argv[2] = "hello"
argv[3] = ";"
argv[4] = "world"
argv[5] = ";"
argv[6] = "hello"
argv[7] = NULL

Вы ищете ; в строке, обозначенной argv[0], но она не содержит ни одного.


Обратите внимание, что ваш подход делает невозможным передачу ; в качестве параметра. Судя по внесенному вами редактированию, вы пытаетесь передать команды для выполнения. Если вы в порядке с командами оболочки, вы можете ожидать, что каждый аргумент будет исполняться командой оболочки.

./forkexec 'ls /foo' 'ls /bar'

Используя этот подход, вы получите argc-1 команды, и они будут найдены в argv[1] .. argv[argc-1]. Они будут выполнены как /bin/sh, -c, argv[i].

1 голос
/ 08 ноября 2019

Вам не нужно делать разбиение, система уже сделала это для вас:

Проверьте это:

#include <stdio.h>

int main(int argc, char *argv[])
{
  for (int i = 0; i < argc; i++)
    printf("argv[%d] = %s\n", i, argv[i]);
}

Если вы запустите это:

. / A.out arg1 arg2 arg3

Вывод будет примерно таким:

argv [0] = ./a.out
argv [1] = arg1
argv [2] = arg2
argv [3] = arg3

...