LINUX.ORG.RU

Системное программирования.

 , ,


4

5

Только знакомлюсь с системный программированиям в среде Линукс. Сейчас читаю книжку Роберта Лав «Системное программирования» (1 издания Питер 2008). Знаю, что уже есть 2 издания, но пока в интернете оно на анг., а покупать не хочу. ( С английским туго. ) Может у кого есть скан 2 издания?

В этой книжке идется о программировании на Си и соответственно есть проблемы с С++.

Я понимаю, что программист С++ должен знать Си, но ...

Есть какая нибудь хорошая книжка о системном программировании С++? Или лучше книжка, где проводится сравнения системного программирования Си и С++?

Чтобы параллельно ее читать вместе с Робертом Лав.



Последнее исправление: beastie (всего исправлений: 3)

Ответ на: комментарий от KennyMinigun

Вот к примеру: как с функции на С вернуть строку заранее неизвестного размера?

char * f(void) {
...
  return str;
}
carb_blog8
()
Ответ на: комментарий от KennyMinigun

И что потом делать со строкой?

Что делать с strdup()?

А вдруг она статическая?

Какой жопой?

А если статическая и дёрнуть get_and_return_string еще раз — str вдруг поменяется.

Зачем? Ты пытаешься найти оправдания своему обсёру? Приведи мне реальный юзкейс, когда мне надо вернуть статическую. А так же что тебе помешает вернуть strdup(статическая)?

Да, но это сколько мороки на ровном месте. А ведь с использванием stl это как «два байта об асфальт»:

Я не увидел ничего полезного.

И тут же получаем умный контейнер «искаропки»

Нахрен он нужен? Ладно я понимаю там когда балабол кукарекает об «конкатенация через += понятней», но когда несут такую явную херню - иди полечись.

Да и с выделением памяти морока.

Какая? В чем заключается?

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

Ты чего хочешь? Выделить место под строку? Юзай маллок. Ты же знаешь её размер правда? Если ты с ней хочешь что-то там сделать - вот тебе указатель и размер - бери и делай.

Да нет, хочу сказать, что вот такие мелочи в Си заставляют смешивать логику программы и алгоритмы обработки внутренних структур. Т.е. надо тебе строка — подожди, подумай: «а как же красиво ее примазать в бизнес-интерфейс функции». А с С++ мы получаем больше удобства и свободы в проектировании подобного рода вещей.

Да, использование того же stl — это повышение абстракции, что неминуемо влечёт за собой падение производительности. Но как мы видели на примере в этом треде: важны алгоритмы, структуры и архитектура, а не «экономия на спичках».

Я отдаю себе отчёт о том, что область применения С/С++ — это низкоуровневые вещи, которые далеки от понятия «бизнес логика». Именно в таких случаях С — правильный выбор. Но, тем не менее, имеем широчайший выбор программ/решений написанных на С/С++ (как свободных, так и проприетарных). А всё почему? Из-за универсальности. И в этом аспекте С++ имеет неоспоримое преимущество (возьмем ту же Qt).

Отдельное слово хочу сказать о «пуристах». Мы, программисты, в большинстве своём перфекционисты и ищем совершенства везде, в том числе при написании программ на С++ часто желаем избежать использования С API (каюсь, сам грешен). С другой стороны труЪ Сионисты. Тут дело еще хуже: эти «джедаи» просто пренебрегают достижениями цивилизации и делают всё своими двумя по-старинке. Так вот: если взглянуть на себя со стороны (а я из первого лагеря), то можно понять насколько это нелепо.

Так к чему я веду: нужно видеть обе точки зрения и держаться той самой «золотой серединки». В данном случае «вернуть строку» действительно проще через std::string. Но на конкретной задаче подход с указателем «извне» может оказаться гораздо лучше. Важно понимать, что есть «религия», а что есть правильно.

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

И что потом делать со строкой?

Что делать с strdup()?

Да копируй на здоровье. Я хотел спросить: кто память освобождать-то будет?

А вдруг она статическая?

Какой жопой?

К примеру man inet_ntoa

Да и с выделением памяти морока.

Какая? В чем заключается?

Код. Логика. Надо следить за выделенной памятью, тут gc не спасёт.

По остальным пунктам — не распарсил. Какой-то бред школярский.

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

Ты просто не осилил спп достаточно хорошо, что бы понять, что это рак современного айти. Говоришь об универсальности? Нуну. Но почему-то на стройке выбрал бы нормальную отвёртку и нормальный молоток, а не швейцарский нож.

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

Ты просто не осилил спп достаточно хорошо, что бы понять, что это рак современного айти.

Вопрос религии :)

Говоришь об универсальности? Но почему-то на стройке выбрал бы нормальную отвёртку и нормальный молоток, а не швейцарский нож.

Именно это я и пытался донести: выбрал бы нормальную отвёртку и нож. И да, аналогии сосут.

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

Ты просто не осилил спп достаточно хорошо

Ты его вообще не осилил. никак. И не опускай себя еще ниже, заявляя, что ты Лев Толстой, что ты 20 лет без вылазно. Не знаешь ты его.

Но почему-то на стройке выбрал бы нормальную отвёртку и нормальный молоток, а не швейцарский нож.

И каждый берущий «нормальный» молоток и «нормальную» отвертку изобретает себе свой собственный «навороченный» швейцарский нож разной степени кривизны.

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

Да копируй на здоровье.

Что копировать? Причем тут копировать?

Я хотел спросить: кто память освобождать-то будет?

Куда освобождать? Мне ничего не надо освобождать. Тебе надо - освобождай как хочешь.

В дефолтной сишке дефолтная обезьяна заюзает free(), проблемы?

К примеру man inet_ntoa

Твой std::string так не умеет, зачем ты кукарекаешь о том, что не умеют крестовые строки?

Как это относится к «возврат строки любой длинные»? Значит это возврат строки не «любой длинны»?

В чем конкретно тут проблема? Тут даже «удалять» ничего не надо.

Код. Логика.

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

Надо следить за выделенной памятью, тут gc не спасёт.

Писать free()? В чем конкретно проблема? Типа забудешь написать free()?

Во всех нормальный конпеляторах есть, если твоя жопа так уж и просит:

void auto_free(void ** ptr) {
  free(*ptr);
}
#define autoclean __attribute__((cleanup(auto_free)))

int main(void) {
  autoclean char * str = malloc(1005000);
}

Только это нахрен никогда не надо, ибо пишет такой код только обезьяна.

Выкатывай юзкейс - я тебе покажу как пишут пацаны.

По остальным пунктам — не распарсил. Какой-то бред школярский.

Просто ответить нечего.

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

Да нет, хочу сказать, что вот такие мелочи в Си заставляют смешивать логику программы и алгоритмы обработки внутренних структур.

Реально на си пишут не обезьяны. Тут к коду совершенно другие требования. Алгоритмы - вчера вылез из недовуза?

Т.е. надо тебе строка — подожди, подумай: «а как же красиво ее примазать в бизнес-интерфейс функции».

Реально вылез из недовуза. Полы у жабистов можешь? «бизнес интерфейс» - сильно.

А с С++ мы получаем больше удобства и свободы в проектировании подобного рода вещей.

Иди в жабу. Там ещё больше. А лучше в пхп.

Да, использование того же stl — это повышение абстракции, что неминуемо влечёт за собой падение производительности. Но как мы видели на примере в этом треде: важны алгоритмы, структуры и архитектура, а не «экономия на спичках».

Давай посоревнуемся? Экономия на спичках. «структуры данных», «алгоритмы» - ещё одна вещь присуща поломойке вылезжей из недовуза.

Вон там пацан пилит ТЗ - запили его на плюсах. Скорее всего тебе даже говноерланг с говном смешает.

Я отдаю себе отчёт о том, что область применения С/С++ — это низкоуровневые вещи, которые далеки от понятия «бизнес логика». Именно в таких случаях С — правильный выбор. Но, тем не менее, имеем широчайший выбор программ/решений написанных на С/С++ (как свободных, так и проприетарных). А всё почему? Из-за универсальности. И в этом аспекте С++ имеет неоспоримое преимущество (возьмем ту же Qt).

Щито? Бред школотнона.

Так к чему я веду: нужно видеть обе точки зрения и держаться той самой «золотой серединки». В данном случае «вернуть строку» действительно проще через std::string. Но на конкретной задаче подход с указателем «извне» может оказаться гораздо лучше. Важно понимать, что есть «религия», а что есть правильно.

Ты так и не осилил сказать «чем проще». Пока проще - это «Обезьяна забудет написать фри». Только «забудет» никак не делает проще.

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

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

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

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

Скоморох Веня раздобыл старые господские фрак и цилиндр, по неосторожности выброшенные дворецким на ближайшую помойку. В этом наряде он явился к дверям джентльменского клуба, где уже начинали собираться элитарии. Пытаясь обратить на себя внимание, Веня начал громко выкрикивать фразы, подслушанные в разговоре господ: «Элита элитна априори», «Элита не ставит себе целью исправление обезьян», «Предпочитаю марочный коньяк». Разумеется, получалось невпопад, к тому же изо рта разило портвешком, и в результате он действительно заставил некоторых элитариев оглянуться. Недоразумение разрешил лакей, который в считанные минуты катапультировался к месту событий при помощи специального высокотехнологичного устройста. Первым делом он щёлкнул юродивого тростью по лбу и пояснил изумлённой элите суть происходящего. После чего, расстегнув ширинку, окропил скомороха бодрой струёй мочи. Несколько господ тактично последовали примеру. По окончании действа, лакей пинками сопроводил Маньку до ближайшего мусорного бачка, где тот и остался лежать, истекая барской мочой и собственной портвешковой блевотиной.

anonymous
()

#define autoclean __attribute__((cleanup(auto_free)))

Прикольно. Но бесполезно.

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

Нет, не получаем мы C. У нас остаётся все тот же C++. Никто не заставляет тебя использовать все фичи языка. Более того, C++ изначально рассчитан на то, что ты не будешь платить за то, что использовать не станешь.

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