Linux Popen System Call в C

Linux Popen System Call V C



Функцията popen() ще изпълни командата, дадена от командата на низа. Функцията трябва да върне указател към поток, който се използва за четене или запис в канала, като същевременно създава канал между извикващото приложение и изпълнената команда. Функцията Popen е налична в стандартната библиотека на I/O функцията и поражда втори процес за изпълнение на терминална команда. Отворената фаза на 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, които приемат аргументите „line“, „sizeof the line“ и „FileOpen“. Fgets прочита предадения процес и го съхранява в символа „%s“ на низ. Този конкретен символ се извиква в метода printf заедно с аргумента „линия“. След като сме създали обработения канал с функцията pclosed, процесът на конвейер може да бъде затворен, както е разгърнат в края на програмата по-долу.



#include


int main ( )

{

ФАЙЛ * FileOpen;

char линия [ 130 ] ;


FileOpen = отваряне ( 'ls -l' , 'р' ) ;

докато ( fgets ( ред, размер на ред, FileOpen ) )

{

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

}

близо ( FileOpen ) ;

}





Функцията popen на програмата C разклони горния процес и след това създаде канала. Сега изпълнихме обработената тръба на потока в обвивката с командата C за компилация. Резултатът изброява всички файлове в директорията „Начало“, тъй като сме изпълнили програмата в тази директория.



Пример 2

В предишната програма popen имаме проста демонстрация на функционалността на програмата popen, която се използва за предаване на потока на процеса на четене на файлове. Сега взехме друг пример за функцията popen, където сме прехвърлили процеса с режим на запис. Нека разгледаме програмата с основна функция. Създадохме променливата на указателя на файла вътре в основната функция като „файл“. Файловият указател се внедрява с функцията popen.

Функцията popen приема командата 'cat' и 'w' за режим на запис. Тук всеки аргумент File се чете последователно и се изпраща към стандартния изход от командата cat. В тялото на цикъла for използвахме функцията fprintf, за да отпечатаме числените стойности на броя, тъй като сме посочили символа „%d“. След това затворен, процесът на popen pipe със системното извикване pclose.

#include


int main ( int argc, char ** argv ) {

ФАЙЛ * файл = отваряне ( 'котка' , 'в' ) ;

int x = 0 ;


за ( х = 0 < 5 ;x++ ) {


fprintf ( файл , „Моят брой = %d ' , х ) ;
}

близо ( файл ) ;

връщане 0 ;

}

Когато изпълнихме създадения по-горе процес, той отпечата стойностите на броя по следния начин.

Пример 3

Сега имаме друга програма, която прехвърля данните от един процес към друг процес. Ще направим това с тръбата от функцията popen. Ние внедрихме програмата, като използвахме стандартните библиотеки на C. След това имаме int main функция за внедряване на програма. Тук сме посочили низа във функцията sprintf с аргумента „buffer“. Функцията sprintf() запазва резултата в буфера char, осигурен от sprintf, вместо да го изпраща към подканата.

След това извикахме функцията popen вътре в променливата „четене“. Там имаме два процеса във функцията popen. „wc -c“ е първият процес, който се използва за преброяване на предоставените знаци, а вторият процес е „w“, който показва, че каналът е отворен в режим на писане. След това имаме функцията „fwrite“, която използва канала за запис на данни. Данните ще бъдат получени от “wc”, след това ще преброят знака и ще бъдат показани в черупката.

#include

#include

#include

#include

int main ( )

{

ФАЙЛ * Прочети ;

char буфер [ петдесет ] ;

sprintf ( буфер, „Системно повикване на Linux“ ) ;

Прочети =отваряне ( 'wc -c' , 'в' ) ;

fwrite ( буфер, размер на ( въглен ) ,стрлен ( буфер ) , Прочети ) ;

близо ( Прочети ) ;

}

Знаците, показани в подканата, са „17“, тъй като низът, който посочихме по-горе, съдържа „17“ знака. Процесът “wc -c” чете тези знаци и ги отпечатва като изход.

Пример 4

Горният пример на popen изпраща данните от един процес към друг. Тук ще получаваме данните от един процес към друг процес чрез канал. Основната функция на програмата е да конструира буфер, който приема „50” стойности. След това създадохме променливата 'r', където функцията popen създаде процеса. Процесът “ls” се използва за изброяване на файловете на директорията, а процесът “r” за четене на данните от канала. Процесът “ls” предава данните към процеса “r” за четене. След това имаме функцията fread, която чете данните и ги съхранява в буфера. След това операторът за печат ще отпечата данните, съхранени в буфера.

#include

#include

#include

#include

int main ( )

{

ФАЙЛ * r;

char буфер [ петдесет ] ;


r = отваряне ( 'л' , 'р' ) ;

страх ( буфер, 1 , 25 , r ) ;


printf ( '%с ' , буфер ) ;

близо ( r ) ;

}

Тук се показват само “50” знака от съществуващите файлове от работната директория. Следователно изходът ще има само 50 знака.

Заключение

Дадохме подробна демонстрация на Linux popen системни извиквания на език C. Реализирахме четири примера, в които сме внедрили функцията popen. Функцията popen връща потока на тръбата според режима, който сме задали. В примерите сме използвали както режима за четене, така и режима на запис с функциите за обработка на файлове fread и fwrite. Използвали сме името на програмата във функцията popen() като неин първи аргумент. Вторият аргумент е файл 'r' като режим на четене или 'w' като режим на запис.