Получение stdout от системы () команда оптимально [копирует]

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

52
задан Coding Mash 7 September 2012 в 05:17
поделиться

6 ответов

Из popen руководства:

#include <stdio.h>

FILE *popen(const char *command, const char *type);

int pclose(FILE *stream);
40
ответ дан jkramer 7 November 2019 в 09:24
поделиться

Попробуйте popen () функция. Это выполняет команду, как система (), но направляет вывод в новый файл. Указатель на поток возвращается.

  FILE *lsofFile_p = popen("lsof", "r");

  if (!lsofFile_p)
  {
    return -1;
  }

  char buffer[1024];
  char *line_p = fgets(buffer, sizeof(buffer), lsofFile_p);
  pclose(lsofFile_p);
32
ответ дан Community 7 November 2019 в 09:24
поделиться

РЕДАКТИРОВАНИЕ: неправильно читайте вопрос как желание передать вывод другой программе, не другую функцию. popen () почти наверняка, что Вы хотите.

Система предоставляет Вам полный доступ к оболочке. Если Вы хотите продолжить использовать его, можно перенаправить, это производится во временный файл системой ("ls> tempfile.txt"), но выбор безопасного временного файла является болью. Или, можно даже перенаправить его через другую программу: система ("ls | otherprogram");

Некоторые могут рекомендовать popen () команда. Это - то, что Вы хотите, если можно обработать вывод сами:

FILE *output = popen("ls", "r");

, который даст Вам подсказку ФАЙЛА, из которой можно читать с выводом команды на нем.

можно также использовать канал (), звонят для создания соединения в сочетании с ветвлением () для создания новых процессов, dup2 () для изменения стандартного ввода и вывода их, должностное лицо (), чтобы запустить новые программы и ожидать () в основной программе для ожидания их. Это просто настраивает конвейер во многом как оболочка, был бы. Посмотрите канал () страница справочника для деталей и примера.

7
ответ дан wnoise 7 November 2019 в 09:24
поделиться

Функции popen() и pclose() могли быть тем, что Вы ищете.

Смотрят на glibc руководство для примера.

1
ответ дан Andrew Edgecombe 7 November 2019 в 09:24
поделиться

В Windows, вместо того, чтобы использовать систему (), CreateProcess использования, перенаправляют вывод к каналу и подключение к каналу.

я предполагаю, что это также возможно в некотором POSIX путь?

1
ответ дан Peter Mortensen 7 November 2019 в 09:24
поделиться

Я не совсем уверен, что его возможное в стандарте C, поскольку два различных процесса обычно не совместно используют пространство памяти. Самым простым путем я могу думать, чтобы сделать это, должен был бы иметь вторую программу, перенаправляют ее вывод к текстовому файлу (programname> textfile.txt) и затем читают, тот текстовый файл въезжают задним ходом для обработки. Однако это не может быть лучшим способом.

0
ответ дан Nicholas Flynt 7 November 2019 в 09:24
поделиться