запуск сценария оболочки с использованием программирования C - PullRequest
0 голосов
/ 11 октября 2011

Привет всем, кого я хочу спросить, я делаю программу, в которой мне нужно запустить скрипт оболочки, используя программу c.до сих пор я разделил аргументы.и я искал, что exec следует использовать для запуска сценариев оболочки, но я совершенно сбит с толку, так как есть много вариантов exec, и, читая справочные страницы, я не могу найти, который лучше всего подходит

Также в некоторых execПервый аргумент функции:

путь

, а некоторые имеют

указатель на файл

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

Ответы [ 3 ]

3 голосов
/ 11 октября 2011

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

#include <stdlib.h>
int system (char *s);

, где s - указатель на путь к сценарию, например,

int rc = system ("/home/username/bin/somescript.sh");

Если вам нуженСтандартный сценарий, посмотрите на справочную страницу popen.

1 голос
/ 12 июня 2013
#include <stdio.h>
#include <stdlib.h>

#define SHELLSCRIPT "\
for ((i=0 ; i < 10 ; i++))\n\
do\n\
echo \"Count: $i\"\n\
done\n\
"

int main(void)
{
  puts("Will execute sh with the following script:");
  puts(SHELLSCRIPT);
  puts("Starting now:");
  system(SHELLSCRIPT);
  return 0;
}

Ссылка: http://www.unix.com/programming/216190-putting-bash-script-c-program.html

0 голосов
/ 11 октября 2011

Все exec* библиотечные функции в конечном итоге являются удобными обертками для системного вызова execve().Просто используйте тот, который вам удобнее.

Те, которые заканчиваются на p (execlp(), execvp()), используют переменную окружения $PATH, чтобы найти программу для запуска.Для остальных вам необходимо использовать полный путь в качестве первого аргумента.

Те, которые заканчиваются на e (execle(), execve()), позволяют вам определить среду (используя последний аргумент).Таким образом вы избежите потенциальных проблем с $PATH, $IFS и другими опасными переменными среды.

Те, которые имеют v в его имени, принимают массив для указания аргументов для запуска программы, в то время какте, которые l принимают аргументы программы для запуска в качестве переменных-аргументов, заканчивающиеся (char *)NULL.Например, execle() очень удобно для создания фиксированного вызова, в то время как execv* допускает ряд аргументов, которые изменяются программно.

...