Re: Как спастись от mysql-server в KDE 4.2
В Суб, 14/03/2009 в 10:30 +0900, Alexander Danilov пишет:
> Покотиленко Костик пишет:
> > В Птн, 13/03/2009 в 23:24 +0900, Alexander Danilov пишет:
> >> Покотиленко Костик пишет:
> >>> В Птн, 13/03/2009 в 14:39 +0300, Victor Wagner пишет:
> >>>> On 2009.03.13 at 11:38:27 +0200, Покотиленко Костик wrote:
> >>>>
> >>>>> Вот-вот.
> >>>>>
> >>>>> Плохая практика: прога с CLI + фронтенд
> >>>>> Хорошая практика: прога с CLI <-- либа --> прога с GUI
> >>>> Абсолютно не факт. первый вариант выносит содержательные действия в
> >>>> отдельный процесс, существенно упрощает отладку и облегчает избавление
> >>>> от блокировок GUI, когда программа занята чем-нибудь важным.
> >>>>
> >>>> В 90% случаев, на которые мне приходилось смотреть в дистрибутиве
> >>>> (естественно, это далеко не все библиотеки, которые в нем есть)
> >>>> авторы библиотек не имели не малейшего понятия, как следует дизайнить
> >>>> интерфейсы библиотек. А это, между прочим, гораздо более сложная задача
> >>>> чем дизайн CLI, заточенного под встраивание.
> >>>>
> >>>> Ну и покрыть функциональность автоматизированными тестами в случае CLI
> >>>> гораздо проще.
> >>> Ни капли не согласен, особенно когда участвуют циклы. CLI->GUI не проще
> >>> ни разу, ни в разработке, ни в использовании, ни в отладке. Кроме,
> >>> конечно, случая, когда разработчик не умеет либы писать.
> >>>
> >> Проще, надо только понимать, что проще не в Си, я в языках, в которых есть нормальная обработка
> >> событий, например, :) Tcl. Можно рулить одновременно многими cli процессами, в том числе и
> >> одинаковыми, а вот на Си, это будет не так уж просто. А в питоне или ruby есть событийная обработка
> >> на сокетах или каналах ввода/вывода?
> >
> > Ты на Си в музее смотрел?
> >
>
> И давно на Си можно сделать событийную обработку канала или сокета в ТРИ строки?
Вот универсальная конструкция для select:
char strtmp[1024];
struct timeval tv;
int retval;
fd_set rfds;
fd_set wfds;
for(;;) {
FD_ZERO(&rfds);
FD_ZERO(&wfds);
FD_SET(0, &rfds);
FD_SET(1, &wfds);
tv.tv_sec = 5;
tv.tv_usec = 0;
retval = select(1, &rfds, &wfds, NULL, &tv);
if(retval>0) {
/* Processing connections */
if(FD_ISSET(0, &rfds)) {
// read(0, buf, 1024);
}
if(FD_ISSET(1, &wfds)) {
// write(1, buf, 1024);
}
} else if(retval==-1) {
if(errno!=4) { /* Interrupted system call, we get that for SIGHUP
*/
sprintf(strtmp, "Select failed: errno=%d, %s", errno,
strerror(errno));
write(2, strtmp, strlen(strtmp));
exit(5);
} else {
sprintf(strtmp, "Select failed: errno=%d, %s, (Interrupted system
call, we get that for SIGHUP)\n", errno, strerror(errno));
write(2, strtmp, strlen(strtmp));
}
} else {
}
}
--
Покотиленко Костик <casper@meteor.dp.ua>
Reply to: