В винде есть ведь такая функция типа WinExec() для выполнения команд из программы.
Не могли бы подсказать соответствующую функцию в линуксе и библиотеку, которую необходимо подключить, чтобы эту функцию использовать?
Решено: Исправлено: Выполнение команд в C (Ну такие команды Bash)
Модератор: Модераторы разделов
-
fleisch
- Сообщения: 40
- ОС: OpenSuSE Linux 11.1
-
destr
- Сообщения: 128
- ОС: Debian
Re: Решено: Исправлено: Выполнение команд в C
Код: Выделить всё
#include <stdlib.h>
int system(const char *command);-
fleisch
- Сообщения: 40
- ОС: OpenSuSE Linux 11.1
Re: Решено: Исправлено: Выполнение команд в C
Огромное спасибо! Надеюсь, заработает 
-
RasenHerz
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: Решено: Исправлено: Выполнение команд в C
советую изучить системный вызов fork() и семейство функций exec().
-
nesk
- Сообщения: 2268
- Статус: Линукссаксовец
- ОС: MS Windows XP Home SP3
Re: Решено: Исправлено: Выполнение команд в C
зачем все так усложнять?
потом еще про wait() надо не забыть
а system() все сделает сама, и fork и exec и wait.
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.
0xDEFEC8ED
0xDEFEC8ED
-
RasenHerz
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: Решено: Исправлено: Выполнение команд в C
wait*() - совсем не обязателен, просто в списки процессов зомби прибавится еще один, так что это не критично)
а к вызову system() у всех свое отношение, лично у меня оно больше отрицательное, чем положительное, да и в примерах по программированию (особенно по управлению процессами) используют именно exec*() и предшествующий fork().
а к вызову system() у всех свое отношение, лично у меня оно больше отрицательное, чем положительное, да и в примерах по программированию (особенно по управлению процессами) используют именно exec*() и предшествующий fork().
-
nesk
- Сообщения: 2268
- Статус: Линукссаксовец
- ОС: MS Windows XP Home SP3
Re: Решено: Исправлено: Выполнение команд в C
Это пример влияние российской ментальности на программирования? Типа nproc большой, от одного зомби ресурсов не убудет.. а потом еще одного и еще одного пока не упремся в ограничения кол-ва процессов для пользователя или в ограничения процессов в системе вообще.
Конечно для пользователя или админа появления в системе небольшого кол-ва зомби не критично, потому что они рассчитывают на корректность программы и программиста по отношению к порождённым процессам. А если программист не был корректен, то ситуация с зомби может быть подобна ситуации с утечкой памяти.
Задачка:
Есть программа, которая по схеме fork-exec каждые 30 секунд вызывает внешнюю утилиту(и не вызывает wait).
Вопрос: Если данную программу запустит обычный пользователь, то через сколько минут у этого пользователя не будут возможности запустить новый процесс? От это зависит? Какими командами можно посмотреть/поменять параметры, которые на это повлияют?
Зомбей конечно боятся не надо, но и плодить их в огромных количествах для программиста просто неприемлемо. Если уж Вы не хотите обрабатывать код завершения порождённого процесса, то хотя бы поставьте явный игнор для сигнала SIGCHLD
хотя бы так: signal(SIGCHLD,SIG_IGN);
тогда Зомбей не будет вообще
во первых system - это функция, а не системный вызов
во вторых - личные отношение с теми или иными функциями не должно влиять на программирование.
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.
0xDEFEC8ED
0xDEFEC8ED
-
RasenHerz
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: Решено: Исправлено: Выполнение команд в C
Задачка:
Есть программа, которая по схеме 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
system - функция стандартной библиотеки.
А fork, exec и т.п. - нет.
-
RasenHerz
- Сообщения: 1341
- ОС: Arch Linux amd64