Системски позиви које обезбеђује линук језгро изложени су у програмском језику Ц путем глибц. Када се користи системски позив, комуницирате са ОС -ом, а по повратку ОС вам комуницира кроз параметре који се враћају у функције системског позива (повратне вредности).
Позив Стат система:
Системски позив Стат је системски позив у Линуку ради провере статуса датотеке, на пример, када се датотеци приступа. Системски позив стат () заправо враћа атрибуте датотеке. Атрибуте датотеке иноде у основи враћа функција Стат (). Иноде садржи метаподатке датотеке. Иноде садржи: врсту датотеке, величину датотеке, када је датотеци приступано (измењено, избрисано), то јест временске ознаке, и путању до датотеке, кориснички ИД и ИД групе, везе до датотеке и физичку адресу садржаја датотеке.
Можемо рећи да иноде садржи све податке који су потребни за системски позив стат () и да је то индексни број датотеке која је сачувана у табели иноде. Кад год креирате датотеку, ствара се иноде број за ту датотеку. Помоћу системског системског позива можете прегледати системске табеле.
Синтакса системског позива Ц Стат:
Да бисте користили системски позив стат у програмском језику Ц, морате укључити следећу датотеку заглавља:
#инцлуде
Стат се користи за добијање статуса датотеке. Синтакса Ц стат системског позива можда није иста за сваки оперативни систем. У Линуку синтакса за системски позив стат је следећа:
интдржава(цонст цхар *пут, струцтдржава*буф)
Врста функције која се враћа у инт, ако се функција успешно изврши, 0 се враћа ако има грешака, -1 ће бити враћено.
Ево цонст цхар *путања одређује назив датотеке. Ако је путања датотеке симболична веза, морате навести везу уместо имена датотеке.
Затим у функцији имамо статичку структуру у којој се чувају подаци или информације о датотеци која користи показивач по имену буф, који се предаје као параметар и попуњава током извршавања позива и чита га корисник након позива.
Структура статистике:
Структура стат која је дефинисана у датотеци заглавља садржи следећа поља:
струцтдржава{
моде_т ст_моде;
ино_т ст_ино;
дев_т ст_дев;
дев_т ст_рдев;
нлинк_т ст_нлинк;
уид_т ст_уид;
гид_т ст_гид;
офф_тст_сизе;
струцттимспец ст_атим;
струцттимспец ст_мтим;
струцттимспец ст_цтим;
блксизе_т ст_блксизе;
блкцнт_т ст_блоцкс;
};
Опис:
- ст_дев: То је ИД уређаја на којем тренутно имамо датотеку.
- ст_рдев: Ово поље описује да одређена датотека представља одређени уређај.
- ст_ино: То је иноде број или серијски број датотеке. Пошто је то индексни број, требало би да буде јединствен за све датотеке
- ст_сизе: ст_сизе је величина датотеке у бајтовима.
- ст_атиме: То је последњи пут или недавно време приступа датотеци.
- ст_цтиме: Недавно је дошло до промене статуса или дозвола датотеке.
- ст_мтиме: То је недавно време када је датотека измењена.
- ст_блксизе: Ово поље даје жељену величину блока за И/О систем датотека која се може разликовати од датотеке до датотеке.
- ст_блоцкс: Ово поље говори о укупном броју блокова вишеструко од 512 бајтова.
- ст_нлинк: Ово поље приказује укупан број чврстих веза.
- ст_уид: Ово поље означава ИД корисника.
- ст_гид: Ово поље означава ИД групе.
- ст_моде: Указује на дозволе за датотеку, говори о начинима на датотеци. Следе заставице које треба дефинисати за поље ст_моде:
Заставе | Опис | Вредност заставице |
---|---|---|
С_ИФМТ | Битмаска која се користи за добијање вредности режима датотеке | 0170000 |
С_ИФСОЦК | Датотека константа утичнице | 0140000 |
С_ИФЛИНК | Константа датотеке симболичке везе | 0120000 |
С_ИФРЕГ | Датотека константа за обичну датотеку | 0100000 |
С_ИФБЛК | Датотека константа за датотеку блока | 0060000 |
С_ИФДИР | Константа датотеке за датотеку директоријума | 0040000 |
С_ИФЦХР | Датотека константа за датотеку знакова | 0020000 |
С_ИФИФО | Фифо константа датотеке | 0010000 |
С_ИСУИД | Поставите бит Усер ИД | 0004000 |
С_ИСГИД | Подесите бит ИД групе | 0002000 |
С_ИСВТКС | Лепљиви бит који означава заједнички текст | 0001000 |
С_ИРВКСУ | Дозволе власника (читање, писање, извршавање) | 00700 |
С_ИРУСР | Дозволе за читање за власника | 00400 |
С_ИВУСР | Дозволе за писање за власника | 00200 |
С_ИКСУСР | Извршите дозволе за власника | 00100 |
С_ИРВКСГ | Групне дозволе (читање, писање, извршавање) | 00070 |
С_ИРГРП | Дозволе за читање за групу | 00040 |
С_ИВГРП | Дозволе за писање за групу | 00020 |
С_ИКСГРП | Извршите дозволе за групу | 00010 |
С_ИРВКСО | Дозволе за друге (читање, писање, извршавање) | 00007 |
С_ИРОТХ | Дозволе за читање за друге | 00004 |
С_ИВОТХ | Дозволе за писање за друге | 00002 |
С_ИКСОТХ | Извршите дозволе за друге | 00001 |
Како се користи системски позив Стат:
Следећи пример приказује како се користи системски позив стат у програмском језику Ц у Линуку, Убунту.
ПРИМЕР 1:
У следећем коду ћемо пронаћи начин датотеке:
КОД:
#инцлуде#инцлуде
интглавни()
{
// показивач на стат струцт
струцтдржавни сфиле;
// стат системски позив
држава('стат.ц', &сфиле);
// приступање ст_моде (члан података стат струцт)
принтф ('ст_моде = %о',сфиле.ст_моде);
повратак 0;
}
Састављање и покретање програма враћа се на следећи начин:
У овом коду смо проследили име датотеке у системском позиву стат, а затим показивач на стат структуру која је сфиле. Показивач на стат струцт се затим користи за приступ ст_моде који приказује начин рада датотеке помоћу исказа принтф.
Заглавље датотека се користи тако да можете користити стат системски позив. Заглавље је стандардна датотека улазне/излазне библиотеке тако да можете користити принтф или сцанф у свом Ц коду.
ПРИМЕР 2:
У следећем коду ћемо добити информације о датотеци помоћу системског позива стат:
КОД:
#инцлуде#инцлуде
#инцлуде
#инцлуде
празнинасфиле(цхар цонстназив документа[]);
интглавни(){
ссизе_т реад;
цхар*тампон= 0;
сизе_тбуф_сизе= 0;
принтф ('Унесите назив датотеке за проверу: н');
читати=гетлине(&тампон, &буф_сизе,стдин);
ако (читати<=0 ){
принтф ('гетлине није успео н');
излаз (1);
}
ако (тампон[читати-1] == ' н'){
тампон[читати-1] = 0;
}
интс=отворен(тампон,О_РДОНЛИ);
ако(с== -1){
принтф ('Датотека не постоји н');
излаз (1);
}
елсе{
сфиле(тампон);
}
бесплатно (тампон);
повратак 0;
}
празнинасфиле(цхар цонстназив документа[]){
струцтдржавни сфиле;
ако(држава(назив документа, &сфиле)== -1){
принтф ('Десила се грешка н');
}
// Приступање члановима података стат струцт
принтф (' нДатотека ст_уид %д н',сфиле.ст_уид);
принтф (' нДатотека ст_блксизе %лд н',сфиле.ст_блксизе);
принтф (' нДатотека ст_гид %д н',сфиле.ст_гид);
принтф (' нДатотека ст_блоцкс %лд н',сфиле.ст_блоцкс);
принтф (' нДатотека ст_сизе %лд н',сфиле.ст_сизе);
принтф (' нДатотека ст_нлинк% у н',(непотписано инт)сфиле.ст_нлинк);
принтф (' нКорисник дозволе за датотеке н');
принтф ((сфиле.ст_моде &С_ИРУСР)? 'р':'-');
принтф ((сфиле.ст_моде &С_ИВУСР)? 'ин':'-');
принтф ((сфиле.ст_моде &С_ИКСУСР)? 'Икс':'-');
принтф (' н');
принтф (' нГрупа дозвола за датотеке н');
принтф ((сфиле.ст_моде &С_ИРГРП)? 'р':'-');
принтф ((сфиле.ст_моде &С_ИВГРП)? 'ин':'-');
принтф ((сфиле.ст_моде &С_ИКСГРП)? 'Икс':'-');
принтф (' н');
принтф (' нДозволе за датотеке Остало н');
принтф ((сфиле.ст_моде &С_ИРОТХ)? 'р':'-');
принтф ((сфиле.ст_моде &С_ИВОТХ)? 'ин':'-');
принтф ((сфиле.ст_моде &С_ИКСОТХ)? 'Икс':'-');
принтф (' н');
}
ИЗЛАЗНИ ПОДАЦИ:
У горњи Ц код смо унели назив датотеке и ако датотека не постоји тада ће се извршење програма зауставити. Ово је приказано на следећој слици:
Ако наша датотека постоји, позваће се функција сфиле (н) у којој смо проследили име датотеке. Унутар функције, пре свега, користили смо системски позив Стат, ако стат () врати -1, онда мора постојати било каква грешка па ће се порука одштампати и извршење програма зауставити.
Затим смо у испису принтф користили назив функције и сепаратор тачака за приступ члановима података стат струцт .
Затим смо за начин датотеке приступили макроима или заставама ст_моде. Овде се логика и оператор користе за штампање одговарајућих режима. Проверили смо дозволе за корисника, групу и друге за наведену датотеку (назив датотеке је унео корисник).
Овим можете видети како да користите системски позив стат из програмског језика Ц да бисте добили информације из датотека језгра ОС о датотекама. Ако имате питање, слободно нам реците путем одељка за коментаре.