Системный вызов Exec на C

Exec System Call C



Семейство exec имеет множество функций в C. Эти функции C в основном используются для запуска системной команды в отдельном процессе от основной программы и печати вывода.

В этой статье я расскажу о семействе функций exec и покажу вам, как использовать каждую из этих функций семейства exec в C. Итак, приступим.







Системные функции C в семействе Exec:

Семейства функций exec определены в заголовке. unistd.h . Таким образом, вы должны использовать этот заголовок в программе C, где вы хотите использовать эти функции.



Доступные функции exec вместе с их параметрами функций приведены ниже:



  • int execl (const char * путь, const char * arg,…, NULL);
  • int execlp (const char * file, const char * arg,…, NULL);
  • int execv (const char * путь, char * const argv []);
  • int execvp (const char * файл, char * const argv []);
  • int execle (const char * path, const char * arg,…, NULL, char * const envp []);
  • int execve (const char * файл, char * const argv [], char * const envp []);

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





execl () Системная функция:

В execl () системная функция принимает путь к исполняемому двоичному файлу (т.е. / bin / ls ) как первый и второй аргумент. Затем аргументы (т.е. -lh , /дом ), который вы хотите передать исполняемому файлу, за которым следует НУЛЕВОЙ . Затем системная функция execl () запускает команду и распечатывает результат. Если возникает какая-либо ошибка, execl () возвращает -1. В противном случае он ничего не возвращает.

Синтаксис:

intexecl(const символ *дорожка, const символ *злой,...,НУЛЕВОЙ);

Пример системной функции execl () приведен ниже:



#включают

intглавный(пустота) {
символ *binaryPathзнак равно '/ bin / ls';
символ *arg1знак равно '-lh';
символ *arg2знак равно '/дом';

execl(binaryPath,binaryPath,arg1,arg2,НУЛЕВОЙ);

возвращение 0;
}

Я запустил ls -lh / home команда с помощью системной функции execl (). Как видите, отображается правильный результат.

execlp () Системная функция:

execl () не использует ДОРОЖКА переменная окружения. Итак, полный путь к исполняемому файлу требуется для его запуска с помощью execl (). execlp () использует переменную среды PATH. Итак, если исполняемый файл или команда доступны в PATH, то команды или имени файла достаточно для ее запуска, полный путь не требуется.

Синтаксис:

intexeclp(const символ *файл, const символ *злой,...,НУЛЕВОЙ);

Мы можем переписать пример execl (), используя системную функцию execlp () следующим образом:

#включают

intглавный(пустота) {
символ *programNameзнак равно 'ls';
символ *arg1знак равно '-lh';
символ *arg2знак равно '/дом';

execlp(programName,programName,arg1,arg2,НУЛЕВОЙ);

возвращение 0;
}

Я передал только имя команды ls , а не полный путь / bin / ls . Как видите, результат такой же, как и раньше.

execv () Системная функция:

В функции execl () параметры исполняемого файла передаются в функцию как разные аргументы. С execv () вы можете передать все параметры в массиве с завершением NULL argv . Первым элементом массива должен быть путь к исполняемому файлу. В противном случае функция execv () работает так же, как функция execl ().

Синтаксис:

intexecv(const символ *дорожка, символ *constargv[]);

Мы можем переписать пример execl () следующим образом:

#включают

intглавный(пустота) {
символ *binaryPathзнак равно '/ bin / ls';
символ *аргументы[] знак равно {binaryPath, '-lh', '/дом',НУЛЕВОЙ};

execv(binaryPath,аргументы);

возвращение 0;
}

Как видите, я получаю правильный результат.

execvp () Системная функция:

Работает так же, как системная функция execv (). Но используется переменная среды PATH. Таким образом, полный путь к исполняемому файлу не требуется, как в execlp ().

Синтаксис:

intexecvp(const символ *файл, символ *constargv[]);

Мы можем переписать пример execv () следующим образом:

#включают

intглавный(пустота) {
символ *programNameзнак равно 'ls';
символ *аргументы[] знак равно {programName, '-lh', '/дом',НУЛЕВОЙ};

execvp(programName,аргументы);

возвращение 0;
}

Как видите, отображается правильный результат.

execle () Системная функция:

Работает так же, как execl (), но вы можете указать вместе с ним свои собственные переменные среды. Переменные среды передаются в виде массива envp . Последний элемент envp массив должен быть ПУСТО (NULL). Все остальные элементы содержат пары ключ-значение в виде строки.

Синтаксис:

intэкзекль(const символ *дорожка, const символ *злой,...,НУЛЕВОЙ, символ * constenvp[] );

Пример системной функции execle () приведен ниже:

#включают

intглавный(пустота) {
символ *binaryPathзнак равно '/ bin / bash';
символ *arg1знак равно '-c';
символ *arg2знак равно 'выбросил 'Посетите $ HOSTNAME:$ PORT из вашего браузера.'';
символ *constenv[] знак равно {HOSTNAME = www.linuxhint.com, 'ПОРТ = 8080',НУЛЕВОЙ};

экзекль(binaryPath,binaryPath,arg1,arg2,НУЛЕВОЙ,env);

возвращение 0;
}

Я передал две переменные среды HOSTNAME а также ПОРТ в функцию execle (). Как видите, я могу получить к ним доступ из исполняемого файла / bin / bash .

execve () Системная функция:

Как и execle (), вы можете предоставить свои собственные переменные среды вместе с execve (). Вы также можете передавать аргументы в виде массивов, как в execv ().

Синтаксис:

intExecve(const символ *файл, символ *constargv[], символ *constenvp[]);

Пример execle () можно переписать следующим образом:

#включают

intглавный(пустота) {
символ *binaryPathзнак равно '/ bin / bash';
символ *constаргументы[] знак равно {binaryPath, '-c', 'выбросил 'Посетите $ HOSTNAME:$ ПОРТ
из вашего браузера.'',НУЛЕВОЙ};
символ *constenv[] знак равно {HOSTNAME = www.linuxhint.com, 'ПОРТ = 8080',НУЛЕВОЙ};

Execve(binaryPath,аргументы,env);

возвращение 0;
}

Как видите, мы получаем тот же результат, что и в примере с execle ().

Итак, вот как вы используете семейство функций exec в C для системного программирования в Linux. Спасибо, что прочитали эту статью.