Линук Попен системски позив у Ц

Linuk Popen Sistemski Poziv U C



Функција попен() ће извршити команду дату наредбом стринга. Функција би требало да врати показивач на ток који се користи за читање или уписивање у цев, истовремено креирајући цев између апликације која позива и извршене команде. Функција Попен је доступна у стандардној библиотеци И/О функције и покреће други процес за покретање терминалске команде. Отворена фаза функције попен() је иста као и отворена фаза у функцији фопен(). Функција попен() покреће процес рачвањем, конструисањем цеви и извршавањем љуске. Пошто је цев подразумевано једносмерна; као резултат, ток је или само за читање или само за писање. Након успешног извршавања функције попен(), добија се отворени ток који се користи за цев за читање и писање.“

Пример 1

Са следећим примером програма, прочитаћемо датотеке које постоје у тренутном директоријуму или фасцикли користећи системски позив попен. Прво, унели смо датотеку заглавља стдио.х стандардне библиотеке Ц. Затим, имамо програмску функцију инт маин() где смо применили функцију попен. Пре тога смо успоставили променљиву показивача „ФилеОпен“ из класе „ФИЛЕ“. Променљива показивача датотеке указује на следећи бајт за читање или писање.







Након тога, доделили смо граничну вредност карактера за читање. Променљива „ФилеОпен“ је затим позвала функцију „попен“. Функција „попен“ преузима команду „лс -л“ Линук-а, која ће излистати све датотеке тренутног директоријума. Штавише, унели смо параметар „р“ у функцију попен, што указује на режим читања.



Овде смо спровели процес читања датотека користећи функцију попен. Затим смо обрађивали креирану цев са вхиле петљом. Док петља користи методе фгетс, које узимају аргументе „лине“, „величина линије“ и „ФилеОпен“. Фгетови читају процес са цевима и чувају га у симболу „%с“ низа. Овај симбол се позива унутар принтф методе заједно са аргументом „лине“. Једном када смо креирали обрађену цев, са функцијом пцлосед, цевоводни процес се може затворити као што је распоређено на крају програма испод.



#инцлуде <стдио.х>


инт маин ( )

{

ФИЛЕ * ФилеОпен;

цхар линија [ 130 ] ;


ФилеОпен = отвори ( 'лс -л' , 'р' ) ;

док ( фгетс ( лине, сизеоф лине, ФилеОпен ) )

{

принтф ( '%с' , линија ) ;

}

пцлосе ( ФилеОпен ) ;

}





Попен функција Ц програма је раздвојила горњи процес, а затим креирала цев. Сада смо извршили обрађену цев тока у љусци помоћу Ц команде за компилацију. Излаз је навео све датотеке у директоријуму „Хоме“ пошто смо извршили програм у том директоријуму.



Пример 2

У претходном попен програму имамо једноставну демонстрацију функционалности попен програма који се користи за цевоводни процес стримовања читања датотека. Сада смо узели још један пример функције попен где смо процес пребацили у режим писања. Размотримо програм са главном функцијом. Конструисали смо променљиву показивача датотеке унутар главне функције као „датотека“. Показивач датотеке се примењује помоћу функције попен.

Функција попен узима команду „цат“ и „в“ за режим писања. Овде се сваки аргумент датотеке секвенцијално чита и шаље на стандардни излаз помоћу команде цат. У телу петље фор, користили смо функцију фпринтф за штампање нумеричких вредности бројања пошто смо навели симбол „%д“. Затим је затворен, процес попен пипе са системским позивом пцлосе.

#инцлуде <стдио.х>


инт маин ( инт аргц, цхар ** аргв ) {

ФИЛЕ * фајл = попен ( 'мачка' , 'у' ) ;

инт к = 0 ;


за ( Икс = 0 ;Икс < 5 ;к++ ) {


фпринтф ( фајл , „Мој број = %д ' , Икс ) ;
}

пцлосе ( фајл ) ;

повратак 0 ;

}

Када смо извршили горе креирани процес, он је исписао вредности бројања на следећи начин.

Пример 3

Сада имамо други програм који преноси податке једног процеса у други процес. То ћемо урадити са цеви из функције попен. Програм смо имплементирали користећи стандардне библиотеке Ц-а. Затим имамо инт главну функцију за примену програма. Овде смо навели стринг у функцији спринтф са аргументом „буффер“. Функција спринтф() задржава резултат у баферу знакова који обезбеђује спринтф уместо да га шаље у промпт.

Након тога, позвали смо функцију попен унутар променљиве „читај“. Тамо имамо два процеса унутар функције попен. „вц -ц“ је први процес који се користи за бројање датих знакова, а други процес је „в“, што указује да је цев отворена у режиму писања. Након тога, имамо функцију „фврите“ која користи цев за писање података. Податке ће примити „вц“, затим пребројати карактер и приказати у љусци.

#инцлуде<стдио.х>

#инцлуде<стдлиб.х>

#инцлуде<унистд.х>

#инцлуде<стринг.х>

инт маин ( )

{

ФИЛЕ * читати ;

цхар бафер [ педесет ] ;

спринтф ( тампон, „Линукс системски позив“ ) ;

читати =попен ( 'вц -ц' , 'у' ) ;

фврите ( бафер, величина ( цхар ) ,стрлен ( тампон ) , читати ) ;

пцлосе ( читати ) ;

}

Знакови приказани у промпту су „17“ јер стринг који смо навели изнад садржи „17“ знакова. Процес “вц -ц” чита ове знакове и штампа их као излаз.

Пример 4

Горњи пример попен-а шаље податке из једног процеса у други. Овде ћемо примати податке из једног процеса у други процес преко цеви. Главна функција програма је да конструише бафер, који узима „50“ вредности. Затим смо креирали променљиву „р“, где је функција попен креирала процес. Процес „лс“ се користи за листање датотека директоријума, а „р“ процес за читање података из цеви. Процес “лс” преноси податке процесу “р” на читање. После овога имамо функцију фреад која чита податке и чува податке у баферу. Затим ће изјава за штампање одштампати податке ускладиштене у баферу.

#инцлуде<стдио.х>

#инцлуде<стдлиб.х>

#инцлуде<унистд.х>

#инцлуде<стринг.х>

инт маин ( )

{

ФИЛЕ * р;

цхар бафер [ педесет ] ;


р = попен ( 'лс' , 'р' ) ;

фред ( тампон, 1 , 25 , р ) ;


принтф ( „%с ' , тампон ) ;

пцлосе ( р ) ;

}

Овде се приказује само „50“ карактера постојећих датотека из радног директоријума. Дакле, излаз ће имати само 50 знакова.

Закључак

Дали смо детаљну демонстрацију Линук попен системских позива у језику Ц. Имплементирали смо четири примера где смо применили функцију попен. Попен функција враћа ток цеви према режиму који смо доделили. У примерима смо користили и режим читања и писања са функцијама за руковање датотекама фреад и фврите. Користили смо име програма у функцији попен() као његов први аргумент. Други аргумент је датотека 'р' као читање или 'в' као начин писања.