Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> shell из программы 
V
    Опции темы
devmstr
Дата 9.11.2006, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 28.4.2004
Где: Ukraine

Репутация: нет
Всего: 11



Я новичек в программировании под Unix(Linux), поэтому не пинайте меня очень сильно.
Как мне из своей C программы выполнить какою-нибудь команду, ну например ls, и получить обратно результат. Помогите, пожайлуста.


--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
BobiKK
Дата 9.11.2006, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 655
Регистрация: 1.12.2005
Где: Essen, Deutschlan d

Репутация: нет
Всего: 16



Наверное, стандартный механизм fork-and-exec. Поищите какие-нибудь статейки по этому ключевому слову. Наверняка там будет лучше и глубже расписан этот механизм, чем здесь расскажут.
PM MAIL   Вверх
MAKCim
Дата 9.11.2006, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



devmstr, 
кратко
Код

...

int pipefd[2];
pipe(pipefd);

pid_t pid = fork();

if (pid > 0) {
    close(pipefd[1]);
/* тут читаем с pipefd[0] вывод ls */
    waitpid(pid, NULL, 0);

    close(pipefd[0]);
}

else if (pid < 0);      /* Error */

close(pipefd[0]);
/* Child process */
dup2(pipefd[1], 1);

execlp("ls", "ls", "/", NULL);



Это сообщение отредактировал(а) MAKCim - 10.11.2006, 11:09


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Dude03
Дата 10.11.2006, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.4.2006

Репутация: 1
Всего: 6



Цитата(devmstr @  9.11.2006,  22:47 Найти цитируемый пост)
Я новичек в программировании под Unix(Linux), поэтому не пинайте меня очень сильно.
Как мне из своей C программы выполнить какою-нибудь команду, ну например ls, и получить обратно результат. Помогите, пожайлуста. 

Если тебе не надо чисто на системных вызовах, то можешь попробовать функцию system из стандартной библиотеки си. Вроде нао подключить stdlib.h smile 
PM MAIL   Вверх
MAKCim
Дата 10.11.2006, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



можешь еще popen, pclose попробовать
Код

FILE* fs = popen("ls /", "r");

if (fs == NULL) {
/* error */
}

size_t bytes;

char buf[BUF_SIZE];

while ((bytes = fread(buf, sizeof(char), BUF_SIZE, fs)) > 0) {
/* work with buffer `buf' */
}

pclose(fs);


Это сообщение отредактировал(а) MAKCim - 10.11.2006, 11:15


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
BobiKK
Дата 10.11.2006, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 655
Регистрация: 1.12.2005
Где: Essen, Deutschlan d

Репутация: нет
Всего: 16



Цитата(Dude03 @  10.11.2006,  01:29 Найти цитируемый пост)
Если тебе не надо чисто на системных вызовах, то можешь попробовать функцию system из стандартной библиотеки си. Вроде нао подключить stdlib.h

А как через system получить результат выполения программы?
PM MAIL   Вверх
devmstr
Дата 11.11.2006, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 28.4.2004
Где: Ukraine

Репутация: нет
Всего: 11



MAKCim
Громадное спасибо. Именно то, что мне нужно. Взяв за основу ваш пример и разобравшись в том, что мне нужно использовать fork и execlp я написал свой. Все работает.
А можно вопрос по Вашему листингу? Какое предназначение 
Код

pipefd; и pipe(pipefd);
??


--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
MAKCim
Дата 11.11.2006, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата

А можно вопрос по Вашему листингу? Какое предназначение 

cоздание канала
грубо говоря создание буфера обмена между двумя родственными процессами
pipe() возвращает 2 дескриптора - на запись и на чтение, собственно эти операции (read/write на дескрипторах) синхронизируются ядром, потому канал - хороший способ взаимодествия дочернего и родительского процессов при передаче небольших по объему данных (буфер канала обычно не сильно велик)
Если в примере не использовать канал - весь вывод ls пойдет на STDOUT_FILENO (по умолчанию либо терминал, либо псевдотерминал для X) и мы не сможем обработать вывод


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
vdim
Дата 10.9.2008, 05:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 19.4.2008

Репутация: нет
Всего: нет



А могут ли способы через popen либо через execlp передать более чем 4096 байт?
PM MAIL   Вверх
MAKCim
Дата 10.9.2008, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(vdim @  10.9.2008,  05:39 Найти цитируемый пост)
А могут ли способы через popen либо через execlp передать более чем 4096 байт? 

могут


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0496 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.