системная команда зависла в программе на C, но когда я запускаю команду на bash, она успешна - PullRequest
1 голос
/ 27 июля 2010

Мне нужно отправить arp IP-адреса, чтобы получить его MAC-адрес, настроенный на другом компьютере.Я создаю этот ip из программы на C с помощью "system (arping -c 3 -i eth0), но я вижу, что он там зависает.

Но если я запускаю ту же команду из bash", arping -c3 -i eth0 "оно выполнено успешно.

Я не мог понять, почему системная команда зависла в этом случае, когда команда успешно завершена при запуске из bash.

Спасибо,

Ответы [ 3 ]

1 голос
/ 27 июля 2010

Так как вы сказали, что он завис, вы можете попробовать:

strace -o my_prog.strace -f ./my_prog

и затем убей его после того, как он зависнет. Затем вы можете просмотреть выходной файл strace my_prog.strace и попытаться выяснить, что пошло не так.

Возможно, вы захотите заглянуть на man-страницу strace, чтобы увидеть другие опции, которые вам могут понравиться - для меня особенно полезны те, которые позволяют отображать больше данных в буфере (и строке) ввода / вывода.

Если это не совсем зависание, вам нужно проверить возвращаемое значение из вашего звонка на system( ), а затем проверить errno.

редактировать

Что-то, о чем я только что подумал, могло вызвать зависание, было бы, если бы arping была на самом деле ссылкой на корневую программу setuid, которая выполняла sudo на реальном arping, и она ожидает ввода пароля для введите, но терминал для этой программы установлен неправильно.

0 голосов
/ 27 июля 2010

Используете ли вы какой-либо дочерний процесс для выполнения выше?

Из определения системы (): функция system () должна игнорировать сигналы SIGINT и SIGQUIT и блокировать сигнал SIGCHLD во время ожиданияКоманда прекратить.Функция system () не должна возвращаться, пока дочерний процесс не завершится.

Рекомендации:

1.проверить возвращаемое значение system () и принять соответствующее решение.

Например: если возвращаемое значение равно нулю, это означает, что процессор команд недоступен. Если дочерний процесс не может быть создан или если статус завершения для интерпретатора языка команд не может быть получен, system () должна вернуть -1 и установить errno, чтобы указатьОшибка.

2.Используйте полные команды оболочки для выполнения.

Например: system("arping -c 3 -I eth0 10.203.198.10");

0 голосов
/ 27 июля 2010

try system ("arping -c 3 -I eth0 ip-addr"); что-то вроде:

Основной () { система ("arping -c 3 -I eth0 192.168.10.1"); }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...