отправка строки в сокеты C? - PullRequest
1 голос
/ 26 ноября 2010

Я пытаюсь отправить эту строку:

Код сервера:

char bash[256] = "grep 'usernama' data/*.txt | awk -F':' '{print $1}' | uniq";
char result[1000] = system(bash);
send(connected, result,strlen(result), 0);  
fflush(stdout);

Сообщение об ошибке:

error: array must be initialized with a brace-enclosed initializer

Можно ли отправить таким образом результат grep клиенту?

Ответы [ 3 ]

2 голосов
/ 27 ноября 2010

system (3) возвращает вам статус fork (2), но не стандартный вывод разветвленной программы.Стандартное решение - использование труб:

char bash_cmd[256] = "grep 'usernama' data/*.txt | awk -F':' '{print $1}' | uniq":
char buffer[1000];
FILE *pipe;
int len;

pipe = popen(bash_cmd, "r");
if (pipe == NULL) {
    perror("pipe");
    exit(1);
}

fgets(buffer, sizeof(buffer), pipe);
len = strlen(bash_cmd);
bash_cmd[len-1] = '\0';

pclose(pipe);
1 голос
/ 26 ноября 2010

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

Если вы посмотрите на системную справочную страницу , вы увидите, что она возвращает int, состояние завершения команды, которую вы запустили.

Чтобы получить выходные данные процесса, вам необходимо:

  1. Найдите библиотеку, которая сделает это за вас.
  2. Кодируйте свой собственный fork / exec с помощью реализации pipe.
  3. Перенаправить вывод во временный файл, а затем прочитать его. (С @ unwind )

3 будет немного проще, чем 2, но создаст проблемы безопасности и надежности, которых не будет в 1 или 2.

0 голосов
/ 26 ноября 2010

Самый простой способ сделать это, если вы хотите вызвать system() и запустить оболочку, - это, вероятно, перенаправить вывод в файл, затем открыть файл, прочитать его содержимое и отправить его.

Это, конечно, открывает кучу проблем (в основном, состояния гонки и обработки ошибок), но, возможно, это может быть немного проще, чем просто погрузиться и узнать о fork() и exec().

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