как я могу заменить функцию системы? - PullRequest
0 голосов
/ 01 декабря 2018

пример кода с сервера:

dup2( client, STDOUT_FILENO );  /* duplicate socket on stdout */
dup2( client, STDERR_FILENO );  /* duplicate socket on stderr too */

char * msgP = NULL;
int len = 0;
while (len == 0) {
    ioctl(client, FIONREAD, &len);
}

if (len > 0) {
    msgP = malloc(len * sizeof(char));
    len = read(client, msgP, len);

    system(msgP);
    fflush(stdout);
    fflush(stderr);
}

Когда я посылаю команду от клиента, я вызываю системную функцию.Эта функция достаточна для многих команд, но не для всех.Я пробовал несколько разных команд, и у меня были проблемы с некоторыми (например, nano).Проблема, с которой я сталкиваюсь, заключается в том, что после вызова системной функции я больше не могу отправлять какой-либо ввод для этой команды (при необходимости). Я все еще могу отправлять другие команды.Мой вопрос, как я могу решить эту проблему?

PS Я сделал некоторые испытания и команда CD также не работают.кто может объяснить, почему?

Спасибо за помощь!

1 Ответ

0 голосов
/ 01 декабря 2018

Команды test и cd встроены в оболочки командной строки: оболочки не выполняют их как внешние программы.Они читают эти команды и обрабатывают их, внося изменения в самой программе оболочки.

Когда вы выполняете программу с system или подпрограмму из семейства exec, она создает отдельный процесс, который запускает программу,Отдельный процесс может читать входные данные, записывать выходные данные, изменять файлы и общаться в сети, но он не может изменить вещи внутри процесса, который его создал (за исключением того, что он может отправлять некоторую информацию этому процессу, предоставляя код состояния при выходе из системы).или различными способами межпроцессного взаимодействия).Вот почему cd нельзя выполнить с system: отдельный процесс не может изменить рабочий каталог другого процесса.Чтобы выполнить команду cd, вы должны вызвать chdir или fchdir, чтобы изменить рабочий каталог для вашего собственного процесса.

Существует отдельная команда test, но некоторые оболочки выбираютреализовать его внутренне вместо использования внешней программы.Что касается nano, я не знаю, почему он не работает для вас.Это работает для меня, когда я использую system("nano") или system("nano xyz").Вам нужно будет предоставить больше информации о конкретной проблеме, с которой вы сталкиваетесь nano.

Способ, которым ssh обеспечивает удаленное выполнение команд, заключается в том, что он выполняет процесс оболочки на сервере.Оболочка - это программа, которая читает команды из своего ввода и выполняет их.Некоторые из команд, например cd, выполняются внутри.Другие команды он выполняет, вызывая внешние программы.Чтобы предоставить аналогичную услугу, вы можете написать свою собственную оболочку или выполнить одну из существующих оболочек.В системах Unix стандартные оболочки могут быть найдены в /bin с именами, заканчивающимися на sh, такими как /bin/bash и /bin/csh.(Однако не все, оканчивающиеся на sh, обязательно являются оболочкой.)

Даже если вы выполняете оболочку, для ее правильного выполнения есть ряд деталей, в том числе:

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