Запуск программы с использованием execv и передача аргументов без поднятия argc

6 month running correlation

`library(tidyquant)`

`x<-rnorm(100)
y<-rnorm(100)`

`zoo(cbind(x,y),Sys.Date()-1:100)`

`tq_transmute_xy(x          = x, 
                    y          = y,
                    mutate_fun = runCor,
                    n          = 6,
                    col_rename = "rolling.corr.6")`
1
задан mbj 17 January 2019 в 08:13
поделиться

1 ответ

1128 Хорошо, я понял это сейчас, после некоторых собственных экспериментов.

Поскольку передача массива, начинающегося с NULL (0), в execv приводит к распечатке программы LC_MEASUREMENT=de_DE.UTF-8, я понял, что это должно означать, что argv[3] ссылается на элемент в процессе environment (LC_MEASUREMENT - одна из переменных среды, используемая для настройки параметров локали в Linux).

Решение с помощью execv

Поскольку execv скопирует текущую среду в новую программу, нам просто нужно изменить среду и поместить строку "Hello World!" в правильное место перед тем, как звонит execv. Оказывается, что строка, которая печатается, является той, на которую указывает индекс 2 среды.

Чтобы получить доступ к текущей среде, нам нужно объявить переменную environ вне main:

external char **environ;

int main() 
{
    ...

И затем сделать это перед вызовом execv:

[ 111]

Более простое решение с execve

Вместо объявления external char **environ и изменения текущей среды перед вызовом execv, мы можем использовать функцию execve, которая позволяет нам передавать новую массив строк для использования в качестве среды для программы:

        char *argv[] = { NULL };
        char *envp[] = { "foo", "bar", "Hello World!", NULL };
        execve("filepath", argv, envp);

Как показывает приведенный выше фрагмент кода, "Hello World!" должен находиться в индексе 2 среды, независимо от того, какой метод мы используем. [1 134]

Как это работает

Причина, по которой это работает, заключается в том, что существует стандарт того, как аргументы командной строки и окружение размещаются в памяти процесса при выполнении программы: помещается массив окружений с указателями символов сразу после массива аргументов командной строки.

Поскольку эти массивы завершаются записью NULL, это будет выглядеть следующим образом:

+---------+---------------------------------------+ 
| Args    | Environment                           |
+---------+---------+---------+---------+---------+
|  NULL   | envp[0] | envp[1] | envp[2] |  NULL   | 
+---------+---------+---------+---------+---------+
    ^         ^                   ^                     
    |         |                   |
 argv[0]    argv[1]     ...     argv[3]

Надеюсь, искусство ASCII поможет вам понять, почему argv[3] означает то же самое, что и environ[2] ] когда мы выполняем программу следующим образом.

0
ответ дан mbj 17 January 2019 в 08:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: