Системный вызов Linux Popen в C

Sistemnyj Vyzov Linux Popen V C



Функция popen() выполнит команду, заданную командой строки. Функция должна возвращать указатель на поток, который используется для чтения или записи в канал, а также создавать канал между вызывающим приложением и выполняемой командой. Функция Popen доступна в стандартной библиотеке функций ввода-вывода и порождает второй процесс для запуска команды терминала. Открытая фаза функции popen() аналогична открытой фазе функции fopen(). Функция popen() инициирует процесс, разветвляя его, создавая конвейер и выполняя оболочку. Поскольку канал по умолчанию является однонаправленным; в результате поток доступен либо только для чтения, либо только для записи. При успешном выполнении функции popen() получается открытый поток, который используется для чтения и записи канала».

Пример 1

В следующем примере программы мы будем читать файлы, существующие в текущем каталоге или папке, используя системный вызов popen. Во-первых, мы ввели заголовочный файл stdio.h стандартной библиотеки C. Затем у нас есть функция int main() программы, в которой мы развернули функцию popen. Перед этим мы установили указательную переменную «FileOpen» из класса «FILE». Переменная указателя файла указывает следующий байт для чтения или записи.







После этого мы задали значение лимита символа для чтения. Затем переменная «FileOpen» вызывает функцию «popen». Функция «popen» принимает команду «ls -l» Linux, которая выводит список всех файлов текущего каталога. Кроме того, мы ввели параметр «r» в функцию popen, которая указывает режим чтения.



Здесь мы передали процесс чтения файлов, используя функцию popen. Далее мы обработали созданный канал циклом while. Цикл while использует методы fgets, которые принимают аргументы «строка», «размер строки» и «FileOpen». fgets считывают переданный процесс и сохраняют его в символе строки «%s». Этот конкретный символ вызывается внутри метода printf вместе с аргументом «линия». После того, как мы создали обрабатываемый канал с помощью функции pclosed, процесс конвейера можно закрыть, как это было развернуто в конце программы ниже.



#include


внутренний основной ( )

{

ФАЙЛ * ФайлОткрыть;

линия char [ 130 ] ;


ФайлОткрыть = открыть ( 'лс-л' , 'р' ) ;

пока ( fgets ( строка, размер строки, FileOpen ) )

{

printf ( '%s' , линия ) ;

}

закрыть ( ФайлОткрыть ) ;

}





Функция popen программы C разветвила вышеуказанный процесс, а затем создала канал. Теперь мы выполнили обработанный канал потока в оболочке с помощью команды компиляции C. В выводе перечислены все файлы в «Домашнем» каталоге, поскольку мы выполнили программу в этом каталоге.



Пример 2

В предыдущей программе popen у нас есть простая демонстрация функциональности программы popen, которая используется для конвейерной обработки потокового процесса чтения файлов. Теперь мы взяли еще один пример функции popen, где мы передали процесс с режимом записи. Рассмотрим программу с основной функцией. Мы создали переменную указателя файла внутри основной функции как «файл». Указатель файла развертывается с помощью функции popen.

Функция popen принимает команду «cat» и «w» для режима записи. Здесь каждый аргумент File последовательно считывается и отправляется на стандартный вывод командой cat. В теле цикла for мы использовали функцию fprintf для вывода числовых значений счетчика, поскольку мы указали символ «%d». Затем процесс popen pipe закрывается с помощью системного вызова pclose.

#include


внутренний основной ( целочисленный аргумент, символ ** argv ) {

ФАЙЛ * файл = открыть ( 'кошка' , 'в' ) ;

интервал х = 0 ;


за ( Икс знак равно 0 ;Икс < 5 ;х++ ) {


fprintf ( файл , 'Мой счет = %d \n ' , Икс ) ;
}

закрыть ( файл ) ;

возвращаться 0 ;

}

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

Пример 3

Теперь у нас есть другая программа, которая передает данные одного процесса другому процессу. Мы сделаем это с помощью пайпа из функции popen. Мы реализовали программу, используя стандартные библиотеки C. Затем у нас есть функция int main для развертывания программы. Здесь мы указали строку в функции sprintf с аргументом «буфер». Функция sprintf() сохраняет результат в буфере char, предоставленном sprintf, а не отправляет его в подсказку.

После этого мы вызвали функцию popen внутри переменной «read». Там у нас есть два процесса внутри функции popen. «wc -c» — это первый процесс, который используется для подсчета предоставленных символов, а второй процесс — это «w», который указывает, что канал открыт в режиме записи. После этого у нас есть функция «fwrite», которая использует канал для записи данных. Данные будут получены «wc», затем подсчитаны символы и отображены в оболочке.

#include

#include

#include

#include

внутренний основной ( )

{

ФАЙЛ * читать ;

символьный буфер [ 50 ] ;

спринтф ( буфер, «Системный вызов Linux» ) ;

читать =открыть ( 'туалет -с' , 'в' ) ;

fписать ( буфер, размер ( уголь ) ,стрлен ( буфер ) , читать ) ;

закрыть ( читать ) ;

}

В подсказке отображаются символы «17», потому что указанная выше строка содержит «17» символов. Процесс «wc -c» считывает эти символы и печатает их в качестве вывода.

Пример 4

Приведенный выше пример popen отправляет данные из одного процесса в другой. Здесь мы будем получать данные от одного процесса к другому процессу через канал. Основная функция программы — построить буфер, который принимает «50» значений. Затем мы создали переменную «r», где функция popen создала процесс. Процесс «ls» используется для вывода списка файлов каталога, а процесс «r» — для чтения данных из канала. Процесс «ls» передает данные процессу «r» для чтения. После этого у нас есть функция fread, которая считывает данные и сохраняет их в буфере. Затем оператор печати распечатает данные, хранящиеся в буфере.

#include

#include

#include

#include

внутренний основной ( )

{

ФАЙЛ * р;

символьный буфер [ 50 ] ;


р = открытый ( 'лс' , 'р' ) ;

фред ( буфер, 1 , 25 , р ) ;


printf ( '%s \n ' , буфер ) ;

закрыть ( р ) ;

}

Здесь отображаются только «50» символов существующих файлов из рабочего каталога. Поэтому в выводе будет только 50 символов.

Вывод

Мы дали подробную демонстрацию системных вызовов Linux в языке C. Мы реализовали четыре примера, в которых мы развернули функцию popen. Функция popen возвращает поток канала в соответствии с назначенным режимом. В примерах мы использовали как режим чтения, так и режим записи с функциями обработки файлов fread и fwrite. Мы использовали имя программы в функции popen() в качестве ее первого аргумента. Второй аргумент — файл «r» для чтения или «w» для режима записи.