Файл менеджер для директорий в Gigolo на Kubuntu 14.04


Ранее писал о том, как объяснить Gigolo как работать с различными типами файлов. Это сильно помогало, в случае, если эта полезная программа работала в чужеродной среде, отличной от XFCE4 или Gnome. Последнее обновление Kubuntu принесло новой пищи для размышлений. Описанный способ не работает, gfvs-open теперь не слушается текстового файла defaults.list. Однако, решение нашлось.
Читать дальше

Создать загрузучную USB-флешку из Linux среды


Для Linux существует несколько проектов, позволяющих создавать загрузочные USB носители из ISO образа с Windows. Это и кроссплатформенный UNetbootin и WinUSB, который судя по всему больше не поддерживается автором.
Однако, я скачивал Windows 10 с торрентов и записанные флешки на отрез отказывались грузиться :-(
Дело то ли в специфике русского Windows, скаченного в торрентов, то ли в ошибках, которые хором повторяют эти программы. К счастью, у нас есть Grub, который грузит всё и всегда.
В этой статье я постараюсь кратко изложить, что нужно сделать, чтобы Ваш ISO образ попал на USB носитель и при этом с него можно было бы грузиться.
Читать дальше

pthread_cancel() и C++


С приходом в нашу жизнь реализации Linux тредов NPTL, стало доступно досрочное завершение тредов. Представьте себе ситуацию, когда у Вас есть треды с блокирующими системными вызовами или просто треды, использующие sleep() (что ещё хуже) и Вам вдруг понадобилось их завершить. В случае, если Вы программируете на С, скорей всего проблем не будет. Грабли начинают когда Вы решаете сделать тоже самое в C++.

Конечно, с ходу можно посоветывать переписать код и использовать неблокирующие системные вызовы в бесконечном цикле, с условием итерирования. А sleep() заменить на nanosleep() с обработкой EINTR. Но всегда есть абстрактная ситуация в вакууме, когда есть рабочий код и Вам придётся разбираться почему он падает после Ваших изменений.

Кроме того, принудительное завершение треда, может избавить Вас от необходимости контроля начавшейся итерации цикла, или даже, в теории отменить уже запущенный системный вызов, который использует переход в режим ядра (kernel mode).
Читать дальше

sleep() в C


Многие знают, что sleep() обладает плохой точностью. Многие так же знают, что sleep(), как и любой блокирующий системный вызов нужно вызывать в цикле, так как он попросту может не выждать требуемое от него количество времени.
Но в таком случае, после обработки сигнала, когда управляющий поток вернётся в место, где его прервали, sleep() будет вызван с теми же параметрами, что и первый раз.

Возможно, Вы думаете, что можно положиться на то, что sleep() возвращает время, которое ему нужно "доспать" и просто итерировать цикл, до тех пор, пока возвращаемое значение не будет равно 0. Давайте обратимся к документации библиотеки libc.
Читать дальше