LINUX.ORG.RU

Жизнь структуры, которую требует системная функция

 ,


1

4

Здравствуйте.

Неоднократно сталкивался с тем, что функция требует структуру в качестве аргумента. А в мануале не уточняется, понадобится ли переданная структура этой функции в будущем. Как это определять?

В качестве примера написал функцию, кторая устанавливает обработчик на сигнал:

static void set_sig_handler(int sig, void (hnd)(int signum)){
  struct sigaction sa;
  sa.sa_handler = hnd;
  sigemptyset(&sa.sa_mask);
  if(-1 == sigaction(sig, &sa, NULL)) perr_die("set_sig_handler");
}

Тут создается структура sigaction, которая, насколько я понимаю, автоматически исчезает после завершения выполнении функции. Эта структура передается в sigaction и какова ее дальнейшая судьба мне не совсем понятно

★★★★★

В редких случаях когда системная функция принимает на себя или отдаёт управление временем жизни объектов, об этом прямо пишут в манах. Во всех остальных случаях это головная боль пользователя

Gvidon ★★★★
()
Последнее исправление: Gvidon (всего исправлений: 1)
Ответ на: комментарий от Gvidon

То-есть вышеприведенная функция неверна и надо создавать отдельную структуру в глобальном скопе для каждого вызова sigaction?

makoven ★★★★★
() автор топика
Последнее исправление: makoven (всего исправлений: 1)
Ответ на: комментарий от makoven

Там всё нормально со временем жизни структуры. Структура в большинстве случаев нужна только в течении вызова, как хранилище аргументов, не более того.

xaizek ★★★★★
()
Последнее исправление: xaizek (всего исправлений: 1)

Если не указано иное, подразумеваем, что после вызова функции структура больше не нужна.

NightmareZombie
()

А в мануале не уточняется, понадобится ли переданная структура этой функции в будущем. Как это определять?

Ядро никогда не юзает твои структурки. Всё копируется в память ведра, поэтому связь между вызовами функций сохранятся не может никак и не сохраняется никогда.

static void set_sig_handler(int sig, void (hnd)(int signum)){
  struct sigaction sa;
  sa.sa_handler = hnd;
  sigemptyset(&sa.sa_mask);
  if(-1 == sigaction(sig, &sa, NULL)) perr_die("set_sig_handler");//стиль написания ублюдка
}
anonymous
()
Ответ на: комментарий от Gvidon

В редких случаях когда системная функция принимает на себя или отдаёт управление временем жизни объектов

Не может быть по определению.

об этом прямо пишут в манах

Пример можно?

anonymous
()
Ответ на: комментарий от xaizek

Спасибо за разъяснения. И нижеотписавшемся тоже спасибо )

makoven ★★★★★
() автор топика

Кто мне объяснит, зачем вызывать эти sigaction? Чем вам старый добрый signal не нравится?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

man 2 signal

Portability
The only portable use of signal() is to set a signal’s disposition to SIG_DFL or SIG_IGN. The semantics when using signal() to establish a signal handler vary across systems (and POSIX.1 explicitly permits this variation); do not use it for this purpose.
И далее по тексту

makoven ★★★★★
() автор топика
Ответ на: комментарий от makoven

Работает же! И предоставляет простой и понятный интерфейс.

Вот когда из ядра выкинут поддержку signal, тогда и поговорим.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Работает же!

Мне недавно электрик то же самое сказал, когда я попросил переделать автомат в щитке, разрывающий ноль вместо фазы )

makoven ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

Вот когда из ядра выкинут поддержку signal, тогда и поговорим.

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

Работает же! И предоставляет простой и понятный интерфейс.

...и когда линукс, на твой взгляд, таки скатится, и ты попробуешь собрать свой быдлокод под какую-нибудь бсд и он не собирется, что ты скажешь?

Stil ★★★★★
()
Ответ на: комментарий от makoven

На гитхабе тоже клон этой репы есть. Сосфорж удобней, т.к. он с mercurial работает.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Stil

Ты не видишь, что это — комментарии для gettext'а? Естественно, они в родной локали. Все нормальные комментарии на рунглише написаны.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Gvidon

Т.е. очередной эксперт - яснопонятно.

В редких случаях когда системная функция принимает на себя или отдаёт управление временем жизни объектов, об этом прямо пишут в манах.
системная функция
системная

Собственно и онтопик «системная функция». Для справочки - системная функция это man2, а теперь пойди и подумай - почему ты сказал херню.

anonymous
()
Ответ на: комментарий от makoven
if(-1//вот так пишет только либо больной на головку, либо нулёвый студент начитавшийся говна всякого.

Писать так не имеет смысла, ибо даже если ты тотальный дебил и путаешь = и ==, то Си во-первых не для тебя, а во вторых это отслеживает любой вменяемый конпелятор.

Т.е. это неаргументированная блажь адептов какого-то еретического учения, которая при этом нелогичное и вырвиглазное говно.

anonymous
()
Ответ на: комментарий от Solace

Конечно, уверен:

msgstr ...
        "Content-Type: text/plain; charset=koi8-r\n"
        "Content-Transfer-Encoding: 8bit\n"
...

#. "Не могу открыть турель"
#: takepic.c:152
msgid   "Can't open turret"
msgstr  "Не могу открыть турель"

...
#. "Максимальная (MAX) и текущая (CUR) позиции турели:\n"
#: takepic.c:159
#, c-format
msgid   "Turret MAXimum position and CURrent position:\n"
msgstr  "Максимальная (MAX) и текущая (CUR) позиции турели:\n"

...

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от anonymous

Я как однажды увидел такую запись в доках по nodejs, с тех так и пишу когда надо проверить результат функции

makoven ★★★★★
() автор топика
Ответ на: комментарий от Begemoth

Всё наоборот же. Хипстеры ценят старые раритетные вещи, навроде печатных машинок и патефонов

makoven ★★★★★
() автор топика
Ответ на: комментарий от anonymous

это всё тяжёлое наследие алгол-60

в ансиС ужо утвердили мэйнстримный Ада-Паскаль-Алгол-68 - засёр заголовка всем типами и по возможности ещё наверти механизм передачи(полное раскрытие уже в С++ с различением указателей и ссылок).

qulinxao ★★☆
()
Ответ на: комментарий от Eddy_Em

Валидный код, clang, gcc его кушают. Кстати, намного читабельней в случае:


int myfunction( int somearg, char * another arg, struct * Superstruct payloadStruct, long long int structsize, const char * i_love_very_long_strings, int i_don_t_know_that_this_style_may_heart_some_people)
{

}

gh0stwizard ★★★★★
()
Ответ на: комментарий от Eddy_Em

Ну ты чего! Смотри как удобно: во-первых, int писать не надо; во-вторых, аргументы одного типа можно написать через запятую; в-третьих, очень удобно писать комментарии к каждому аргументу.

func(a, b, c, d)
char a, b; /* ... */
int *c; /* pointer to ... */
{
    ...
    return d;
}

Очень компактно! Если сидишь с какого-нибудь VT-100, это киллер-фичи, я считаю. Правда, есть небольшие недостатки, но это такая мелочь, что даже и упоминать не стоит.

anonymous
()
Ответ на: комментарий от qulinxao

Спасибо, очень познавательно. Кстати, в каком языке придумали корутины? В С иногда не хватает их.

anonymous
()
Ответ на: комментарий от qulinxao

Это самый незначительный косячок в нашем щитке. На третьем месте - полувыгоревшие общеквартирные рубильники. На втором - перепутаные фаза/ноль на электросчетчиках.

Ну и первое место - толстый фазный провод, который на несколько этажей, зачищен. К нему прикручена восьмерка. К восьмерке прикручен пучек четверок, которые уже идут на автоматы разных квартир. Все это, естественно, без изоляции

makoven ★★★★★
() автор топика
Ответ на: комментарий от anonymous

согласно святому Ритчи в С коротина есть в образе set|get jump.

в машкоде-асме их придумали.

т.е. из hll первый язык в котором были корутины это fortran - там ведь по началу стека не было так что entry

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

Ну, setjmp/longjmp все-таки немного не то. Пользоваться ими неудобно, вернуть что-то кроме int сложно, если функция завершилась longjmp в нее приведет к непредсказуемым последствиям.

anonymous
()
Ответ на: комментарий от qulinxao

В современном мире этого недостаточно. Самая элементраная реализация это в protothreads, без всяких longjmp. Из реальных coroutines, в перле 5 (модуль coro), например, все написано поверх pthread с массивным использованием swapcontext, makecontext и т.п.

gh0stwizard ★★★★★
()
Ответ на: комментарий от gh0stwizard

Да, я знаю что доступно в библиотеках. Меня интересовала поддержка со стороны языка «из коробки».

anonymous
()
Ответ на: комментарий от anonymous

Самый навороченный, имхо, нынче это Go с поддержкой CSP. См. линк выше на вики, там все ЯП есть, в которых поддержка коросов из коробки.

gh0stwizard ★★★★★
()
Ответ на: комментарий от anonymous

заодно и gh0stwizard'у отвечаю.

Я пишу описание функции в стиле doxygen, т.е. каждый параметр описывается после @param .... Все нормально.

Дальше: много параметров у функций бывает крайне редко. И если такое встречается, а запихать все параметры в одну структуру нельзя, то можно так написать:

 
type fname(
   type arg1,
   type arg2,
   ...
   ){
   // и пошла функция
}

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Ты мудак, что с тобой говорить-то

anonymous
()
Ответ на: комментарий от anonymous

тоесть 2 инструкции на 1 строке это для тебя нормально, не вырвиглазно и вообще никак не поощряет недоносков и упоротых детей?

unt1tled ★★★★
()
Ответ на: комментарий от makoven

Что за кретин это делал? И как он до сих пор жив с такой техникой "безопасности"?

Eddy_Em ☆☆☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.