Как запустить несколько execlp () в C? - PullRequest
1 голос
/ 22 июля 2011

Я пытаюсь запустить несколько строк openssl в линейном порядке, используя execlp ():

execlp("openssl","genrsa","-out","rsaprivatekey.pem","2048",(char*) 0);
printf("RSA private success");
execlp("openssl","rsa","-in","rsaprivatekey.pem","-pubout","-out","rsapublickey.pem",(char*) 0);
printf("RSA public success");
execlp("openssl","dgst","-sha1","-sign","rsaprivatekey.pem","-out","1.cipher","1",(char*) 0);
printf("SHA1 sign success");
execlp("openssl","dgst","-sha1","-verify","rsapublickey.pem","-signature","1.cipher","1",(char*) 0);
printf("SHA1 verify success");

В этом случае выполняется только первая строка.Я попытался объединить все в одном execlp () и использовать && для разделения команд, но все еще безрезультатно.Может ли кто-нибудь помочь мне в этом?

Ответы [ 2 ]

3 голосов
/ 22 июля 2011

Причина в том, что "execlp ()" ЗАМЕНЯЕТ вашу текущую программу той, которую вы хотите "exec ()".

ПРЕДЛОЖЕНИЯ: Если вы хотите, чтобы ваша текущая программа сохранялась (по крайней мере, достаточно долго, чтобывызовите несколько экземпляров «openssl», затем используйте что-то вроде «system ()» вместо «execlp».

В противном случае рассмотрите возможность использования сценария оболочки или файла .bat для вызова нескольких команд, затем «execlp»вместо этого ваш скрипт (с соответствующим «bash» или «cmd.exe»).

1 голос
/ 22 июля 2011

Как уже говорилось, причина того, что выполняется только первая команда, состоит в том, что любой член семейства функций exec() никогда не возвращается, когда она успешна - только при ошибке.

Если вы хотите, чтобы операцииЧтобы сделать это последовательно, то использование system() (как уже советовали) является самым простым механизмом.Если вам нужен параллелизм или вам нужен больший контроль над перенаправлением ввода / вывода, вам нужно будет использовать механизм fork().

Каждый раз, когда вы успешно вызываете fork(), он возвращается дважды - один разв родительском процессе, один раз в дочернем процессе.В остальном они очень близки к идентичности;Основное различие заключается в PID и PPID (идентификатор процесса и родительский PID).У ребенка fork() возвращает ноль;поэтому вы можете обнаружить, что ваш процесс должен выполнить соответствующую команду.В родительском элементе fork() возвращает PID нового дочернего процесса, который можно сохранить для последующего использования с wait() или waitpid() и указать, что родительский процесс должен продолжить свою работу (например, порождение большего числа дочерних элементов дляостальные шаги).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...