Как вызывать из моей программы на c, как передать данные в исполняемый файл zlib zlib, который использует stdin/stdout?

У меня есть программное приложение c, которое может генерировать файл, содержащий сжатые данные, которые затем преобразуются в формат zlib путем добавления необходимых верхних и нижних колонтитулов zlib. Я хочу убедиться, что данные были сжаты правильно, вызвав из моего приложения исполняемый файл zlib zlib.

Чтобы вызвать zpipe непосредственно из командной строки linux, используется следующий синтаксис: использование zpipe: zpipe [-d] dest, где "-d" означает декомпрессию. Поэтому содержимое исходного файла направляется в стандартный ввод, а завышенные данные - в стандартный вывод командной строки linux.

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

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

Я вызываю основную функцию моего собственного приложения из командной строки Linux следующим образом: ./myapp ./zpipe -d -i zlib_format_input_compressed_file -o output_decompressed_file

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

    char *newargv[] = {argv[1], argv[2]};   // for zpipe, argc = 2

    if (0 == (my_pid = fork())) {
        if (-1 == execve(argv[1], newargv, NULL)) {
            perror("child process execve failed [%m]");
            return -1;
        }
    }

Проблема в том, как передать содержимое zlib_format_input_compressed_file в stdin zpipe из моей программы на c, как это было сделано из оболочки командной строки, и указать zpipe направить результат в output_decompressed_file. Могу ли я использовать "трубу" для достижения этой цели?

1 ответ

Я нашел этот пример, который в принципе, вероятно, составляет основу того, что я пытаюсь сделать. Нужно создать две трубы. https://jineshkj.wordpress.com/2006/12/22/how-to-capture-stdin-stdout-and-stderr-of-child-program/

Другие вопросы по тегам