Решено: Исправлено: Выполнение команд в C (Ну такие команды Bash)

Модератор: Модераторы разделов

fleisch
Сообщения: 40
ОС: OpenSuSE Linux 11.1

Решено: Исправлено: Выполнение команд в C

Сообщение fleisch »

В винде есть ведь такая функция типа WinExec() для выполнения команд из программы.

Не могли бы подсказать соответствующую функцию в линуксе и библиотеку, которую необходимо подключить, чтобы эту функцию использовать?
Спасибо сказали:
Аватара пользователя
destr
Сообщения: 128
ОС: Debian

Re: Решено: Исправлено: Выполнение команд в C

Сообщение destr »

Код: Выделить всё

#include <stdlib.h>
int system(const char *command);
Спасибо сказали:
fleisch
Сообщения: 40
ОС: OpenSuSE Linux 11.1

Re: Решено: Исправлено: Выполнение команд в C

Сообщение fleisch »

Огромное спасибо! Надеюсь, заработает :)
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Решено: Исправлено: Выполнение команд в C

Сообщение RasenHerz »

советую изучить системный вызов fork() и семейство функций exec().
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Решено: Исправлено: Выполнение команд в C

Сообщение nesk »

RasenHerz писал(а):
13.08.2008 16:39
советую изучить системный вызов fork() и семейство функций exec().

зачем все так усложнять?
потом еще про wait() надо не забыть
а system() все сделает сама, и fork и exec и wait.
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Решено: Исправлено: Выполнение команд в C

Сообщение RasenHerz »

wait*() - совсем не обязателен, просто в списки процессов зомби прибавится еще один, так что это не критично)
а к вызову system() у всех свое отношение, лично у меня оно больше отрицательное, чем положительное, да и в примерах по программированию (особенно по управлению процессами) используют именно exec*() и предшествующий fork().
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: Решено: Исправлено: Выполнение команд в C

Сообщение nesk »

RasenHerz писал(а):
14.08.2008 06:59
wait*() - совсем не обязателен, просто в списки процессов зомби прибавится еще один, так что это не критично)

Это пример влияние российской ментальности на программирования? Типа nproc большой, от одного зомби ресурсов не убудет.. а потом еще одного и еще одного пока не упремся в ограничения кол-ва процессов для пользователя или в ограничения процессов в системе вообще.
Конечно для пользователя или админа появления в системе небольшого кол-ва зомби не критично, потому что они рассчитывают на корректность программы и программиста по отношению к порождённым процессам. А если программист не был корректен, то ситуация с зомби может быть подобна ситуации с утечкой памяти.

Задачка:
Есть программа, которая по схеме fork-exec каждые 30 секунд вызывает внешнюю утилиту(и не вызывает wait).
Вопрос: Если данную программу запустит обычный пользователь, то через сколько минут у этого пользователя не будут возможности запустить новый процесс? От это зависит? Какими командами можно посмотреть/поменять параметры, которые на это повлияют?


Зомбей конечно боятся не надо, но и плодить их в огромных количествах для программиста просто неприемлемо. Если уж Вы не хотите обрабатывать код завершения порождённого процесса, то хотя бы поставьте явный игнор для сигнала SIGCHLD
хотя бы так: signal(SIGCHLD,SIG_IGN);
тогда Зомбей не будет вообще :crazy:

RasenHerz писал(а):
14.08.2008 06:59
а к вызову system() у всех свое отношение, лично у меня оно больше отрицательное, чем положительное,

во первых system - это функция, а не системный вызов
во вторых - личные отношение с теми или иными функциями не должно влиять на программирование. :) К функциям надо относиться сугубо утилитарно и прагматично.
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Решено: Исправлено: Выполнение команд в C

Сообщение RasenHerz »

Задачка:
Есть программа, которая по схеме fork-exec каждые 30 секунд вызывает внешнюю утилиту(и не вызывает wait).
Вопрос: Если данную программу запустит обычный пользователь, то через сколько минут у этого пользователя не будут возможности запустить новый процесс?

всецело зависит от текущей конфигурации и состояния системы. с таким же успехом вы можете попытаться ответить на вопрос: сколько процессов на данный момент запущено на моей машине и какой PID имеет последняя вызванная программа?
неправильно - 84 и 11971 =)
признаюсь, с зомби я сглупил, с кем не бывает(
во первых system - это функция, а не системный вызов

если не изменяет память:
system()->fork()->KERNEL_SPACE::do_fork()->exec*->>KERNEL_SPACE::do_exec()->USER_SPACE
fork()->KERNEL_SPACE::do_fork()->exec*->KERNEL_SPACE::do_exec()->USER_SPACE
не помню есть ли системный вызов do_exec()(на кухне процессов давно не лазил) если что поправьте.
во-первых, это не просто функция, а интерфейсная функция, реализующая системный вызов.
второй вариант быстрее=) первый, вроде еще длиннее, чем я изобразил - там вроде, еще обработка параметров должна быть)
еще один "+" ко второму методу - возможно родителю не нужно сразу дожидаться завершения потомка(вдруг это долговыполняющаяся программа?)
во вторых - личные отношение с теми или иными функциями не должно влиять на программирование.

я думал оно формирует стиль программирования...
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Решено: Исправлено: Выполнение команд в C

Сообщение Zeus »

RasenHerz писал(а):
14.08.2008 06:59
а к вызову system() у всех свое отношение, лично у меня оно больше отрицательное, чем положительное, да и в примерах по программированию (особенно по управлению процессами) используют именно exec*() и предшествующий fork().

system - функция стандартной библиотеки.
А fork, exec и т.п. - нет.
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Решено: Исправлено: Выполнение команд в C

Сообщение RasenHerz »

начался оффтоп...
Спасибо сказали: