2010-12-03 2 views
0

Как я могу выполнить оболочку из кода C?Предоставление контроля оболочке из кода C?

Моя оболочка помещается в /bin/sh

После, похоже, не работает для меня

system("/bin/sh"); 
exec("/bin/sh"); 
+0

Не работает? Можете ли вы рассказать об этом? И какой из функций семейства exec вы использовали? – vpit3833 2010-12-03 07:47:08

ответ

2

Может быть, вам нужно сообщить оболочке он должен быть интерактивным:

system("/bin/sh -i"); 

Однако , Я считаю, что ваш оригинальный вызов system() также должен был вызвать приглашение оболочки.

Обе нотации (с и без «-i») в этой программе дает мне приглашение оболочки (возврат к предыдущей оболочки, набрав «выход» и RETURN или Control-D):

#include <stdlib.h> 
int main(void) 
{ 
    system("/bin/sh -i"); 
    return 0; 
} 
1

Эта программа работает, как ожидается, для меня:

int main() 
{ 
    int ret = system("/bin/sh"); 
    printf ("Shell returned %d\n", ret); 
    return 0; 
} 

с помощью -i вызывает какой-то вопрос переназначения и все висит, как только я набираю команду, которая производит вывод.

Имеются важные отличия между системой () и exec(). система() фактически то же самое, как /bin/sh -c yourCommand в командной строке, так что system("/bin/sh") такая же, как

/bin/sh -c /bin/sh 

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

Exec() вызывает весь образ процесса должен быть заменен командой, указанной так, если бы я написал:

int main() 
{ 
    int ret = exec("/bin/sh"); 
    printf ("Shell returned %d\n", ret); 
    return 0; 
} 

Е() и все после того, как он никогда не был выполнен из-за весь процесс превращается в экземпляр /bin/sh. Правильный способ запуска дочерней команды - это форк, а затем exec в дочернем элементе и ждать в родительском элементе.

Смежные вопросы