Автор Тема: C and PROCFS  (Прочетена 3510 пъти)

sandman_7920

  • Напреднали
  • *****
  • Публикации: 44
    • Профил
C and PROCFS
« -: Jan 22, 2009, 14:40 »
Здравейте имам следният въпрос.

Искам да направя програма която да ползва procfs като конфигурационен файл.
За пример искам да направя експорт на структура от C-то в /proc/primer/config:

struct sMyStruct{
   int userscount,access;
}myStruct;

myStruct.usercount=0;
myStruct.access=0;

и тук export_to("/proc/primer/config",myStruct);

и след това да имам достъп с 'cat|echo' да кажем:

echo usercount=20>/proc/primer/config

cat /proc/primer/config
usercount=20
access=0


Това как може да стане.
Активен

task_struct

  • Напреднали
  • *****
  • Публикации: 576
  • Distribution: Kubuntu 14.04
  • Window Manager: KDE 4.13
    • Профил
Re: C and PROCFS
« Отговор #1 -: Jan 22, 2009, 15:25 »
Procfs е псевдо файлова система, която се генерира при стартиране на системата. Тя е част от ядрото и само то има достъп до нея. Мисля, че единственият начин да създаваш файл там е да си направиш модул за ядрото. Всеки модул може да се регистрира в ProcFS и да си създава директории и файлове.
Активен

"Minds are like parachutes. They only function when they are open." - James Dewar

irc.freenode.net  / #linux-bg

sandman_7920

  • Напреднали
  • *****
  • Публикации: 44
    • Профил
Re: C and PROCFS
« Отговор #2 -: Jan 22, 2009, 15:31 »
Благодаря и Аз бях стигнал до същото заключение, но бях длъжен да питам :):):).
Активен

tarator

  • Напреднали
  • *****
  • Публикации: 849
    • Профил
Re: C and PROCFS
« Отговор #3 -: Jan 22, 2009, 18:17 »
Все пак можеш да представиш конфигурацията си като файлове, само дето няма да е в procfs. Може да използваш fuse или 9p за да направиш приложението ти да изглежда като файлова система.

Преди време тук бях пускал кратка програмка, на която даваш директория с mp3-та и тя създава нова файлова система, в която mp3-ките са сортирани по артисти и албуми.
« Последна редакция: Jan 22, 2009, 18:19 от tarator »
Активен

A gentleman is one who is never rude unintentionally. - Noel Coward

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: C and PROCFS
« Отговор #4 -: Jan 22, 2009, 18:32 »
Да ме извинявате, ама има мноооого по-прост начин да се постигне същото, без да се използва procfs и без да се създава userspace-базирана fs.

man mkfifo.

Просто си създаваш една директория, вътре си създаваш поддиректории и named pipes. Демонът си ги чете. Който иска, пише в тях. Обратното - демонът може да пише в тях и някой да ги чете.
Активен

"Knowledge is power" - France is Bacon

tarator

  • Напреднали
  • *****
  • Публикации: 849
    • Профил
Re: C and PROCFS
« Отговор #5 -: Jan 22, 2009, 18:33 »
gateway,

Не е същото. Помисли и ще се сетиш защо.
Активен

A gentleman is one who is never rude unintentionally. - Noel Coward

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: C and PROCFS
« Отговор #6 -: Jan 22, 2009, 18:38 »
Може да се докара до същото спокойно според мен.

Може ли да се пише там с echo -> да.
Може ли да се чете оттам с cat -> да.
Може ли да се използват позволенията на файловата система -> да.
Могат ли да се "заключват" файлове -> да
Активен

"Knowledge is power" - France is Bacon

sandman_7920

  • Напреднали
  • *****
  • Публикации: 44
    • Профил
Re: C and PROCFS
« Отговор #7 -: Jan 22, 2009, 18:44 »
Да но при fifo когато един прави read докато няма събитие write той виси( first in first out)
mkfifo new.fifo
cat new.fifo = виси докато няма echo alabala>new.fifo
Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: C and PROCFS
« Отговор #8 -: Jan 22, 2009, 18:50 »
Това по какъв начин ти пречи?

В смисъл ако мислиш, че четенето от procfs не е блокираща операция и не се чака от ядрото да се подаде нещо, се лъжеш.
« Последна редакция: Jan 22, 2009, 18:54 от gat3way »
Активен

"Knowledge is power" - France is Bacon

tarator

  • Напреднали
  • *****
  • Публикации: 849
    • Профил
Re: C and PROCFS
« Отговор #9 -: Jan 22, 2009, 19:00 »
Не знаеш кога файл е отворен.
Не можеш да пишеш на произволно място във файла.
От двете следва, че не можеш да има двама четци, които да прочетат същата информация едновременно.
Ако някой изтрие fifo-то, по никакъв начин програмата не разбира за това.
Съществуването на файловете не означава, че от другата страна има някой да върши работата.

И още много други...
Активен

A gentleman is one who is never rude unintentionally. - Noel Coward

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: C and PROCFS
« Отговор #10 -: Jan 22, 2009, 19:11 »
Цитат
Не знаеш кога файл е отворен.

Не те и трябва, трябва ти да знаеш дали се пише или чете. Можеш да си направиш fd set от тези named pipes и да си ги обработваш с цикъл от select()-и. Мааму стара, предполагам даже и epoll механизми могат да се ползват ако желаеш.

Цитат
Не можеш да пишеш на произволно място във файла.

Не знам за начин да можеш да го правиш и с procfs.

Цитат
От двете следва, че не можеш да има двама четци, които да прочетат същата информация едновременно.

Добре де, а трябва ли? Според мен трябва да се гони друго - да се подсигуриш срещу това два процеса да четат едновременно.

Цитат
Съществуването на файловете не означава, че от другата страна има някой да върши работата.

Това е много вярно, за жалост.


Обаче айде да погледнем от друга страна на нещата - по-лесно ли ще е да пишеш модул за ядрото, който ти създава procfs entries и чете/пише от тях? А кой може да ти гарантира, че ще можеш да си ползваш файловата система? В смисъл най-малкото ще трябва да си стартираш програмата с superuser-ски привилегии и ядрото да подържа fuse. Не знам де, на мене този вариант не ми допада много.
Активен

"Knowledge is power" - France is Bacon

tarator

  • Напреднали
  • *****
  • Публикации: 849
    • Профил
Re: C and PROCFS
« Отговор #11 -: Jan 22, 2009, 19:21 »
> Не те и трябва, трябва ти да знаеш дали се пише или чете. Можеш да си направиш fd set от тези
> named pipes и да си ги обработваш с цикъл от select()-и. Мааму стара, предполагам даже и epoll
> механизми могат да се ползват ако желаеш.

Напротив, трябва ти, или по-точно може да ти трябва. Например за да можеш да представяш консистентно (не се сещам българската дума) състояние на клиентите. Представи си, че състоянието е голямо и трябва да се прочете на два пъти, но през това време някакво вътрешно събитие го променя. Двете четения ще доведат до inconsistency. Не е задължително четенето или писането да стане с една атомарна операция.

> Не знам за начин да можеш да го правиш и с procfs.

Ами write функцията на procfs получава offset. И всички имплементации, които съм гледал го използват.

> Добре де, а трябва ли? Според мен трябва да се гони друго - да се подсигуриш срещу това два
> процеса да четат едновременно.

И защо да не трябва? Защо предполагаш, че ще има само един клиент?

> Обаче айде да погледнем от друга страна на нещата - по-лесно ли ще е да пишеш модул за
> ядрото, който ти създава procfs entries и чете/пише от тях?

Не съм казал, че е по-лесно. Но използването на fuse или 9p е наистина лесно. За fuse само предполагам, не съм го използвал. Но за 9p съм писал десетки файлови системи.

Активен

A gentleman is one who is never rude unintentionally. - Noel Coward

tarator

  • Напреднали
  • *****
  • Публикации: 849
    • Профил
Re: C and PROCFS
« Отговор #12 -: Jan 22, 2009, 19:31 »
Да добавя още едно против, за което се сетих: fifo-тата са локални и не могат да се екпортират по мрежата.
Активен

A gentleman is one who is never rude unintentionally. - Noel Coward

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: C and PROCFS
« Отговор #13 -: Jan 22, 2009, 19:37 »
Хм, верно че имало offset. Аз това винаги съм го игнорирал, бля.

ОК, съгласен съм :)

Иначе:

Цитат
Напротив, трябва ти, или по-точно може да ти трябва. Например за да можеш да представяш консистентно (не се сещам българската дума) състояние на клиентите. Представи си, че състоянието е голямо и трябва да се прочете на два пъти, но през това време някакво вътрешно събитие го променя. Двете четения ще доведат до inconsistency. Не е задължително четенето или писането да стане с една атомарна операция.

Абе това е някаква конфигурация. Според мен нито ще се пише много и често, нито ще се чете. В случаят с procfs така или иначе става тарапана, когато четеш/пишеш повече от PAGE_SIZE и там това пак ще възникне като проблем. При положение че има много писане/четене (и като обем и като честота), няма да си спестиш вероятни грозни странични случаи.

От друга страна, това ще е още по-опасно в kernelspace.

Активен

"Knowledge is power" - France is Bacon

tarator

  • Напреднали
  • *****
  • Публикации: 849
    • Профил
Re: C and PROCFS
« Отговор #14 -: Jan 22, 2009, 19:40 »
Разликата е, че 9p или fuse ти позволяват да оправиш страничните случаи, а при fifo-то нямаш никакъв избор освен да се молиш да не се случи нещо такова. А пък колко е "лесно" се диагностицират подобни проблеми...
Активен

A gentleman is one who is never rude unintentionally. - Noel Coward