main функция отличается для USE_INETD и для MULTI_THREADED pvserver. Это характеризуется использованием команды #ifdef. Для USE_INETD посмотрите в том числе файл проекта.
В случае MULTI_THREADED сервера, который используется по умолчанию, pvserver работает в цикле, ожидая клиентов. Когда клиент соединяется, открывается отдельный поток (thread), который вызывает pvMain, чтобы работать с клиентом.
В случае USE_INETD суперсервер (x)inetd вызывает pvserver. pvserver затем использует stdin и stdout для обмена информацией с pvbrowser. В этом случае pvserver состоит только из одного процесса на каждого клиента не смотря на то, что в случае MULTI_THREADED pvserver имеет место 1 поток на клиента + 1 поток для принятия клиента.
В pvMain есть только один цикл, в котором вызываются все доступные маски. Значение, возвращаемое маской, определяет которая маска будет вызвана следующей.
/*************************************************************************** main.cpp - description ------------------- begin : So Mai 14 10:22:48 2006 email : lehrig@t-online.de ***************************************************************************/ #include "pvapp.h" // todo: comment me out. you can insert these objects as extern in your masks. //rlModbusClient modbus(modbusdaemon_MAILBOX,modbusdaemon_SHARED_MEMORY,modbusdaemon_SHARED_MEMORY_SIZE); //rlSiemensTCPClient siemensTCP(siemensdaemon_MAILBOX,siemensdaemon_SHARED_MEMORY,siemensdaemon_SHARED_MEMORY_SIZE); //rlPPIClient ppi(ppidaemon_MAILBOX,ppidaemon_SHARED_MEMORY,ppidaemon_SHARED_MEMORY_SIZE); int pvMain(PARAM *p) { int ret; pvSetCaption(p,"pvs"); pvResize(p,0,1280,1024); //pvScreenHint(p,1024,768); // this may be used to automatically set the zoomfactor ret = 1; pvGetInitialMask(p); if(strcmp(p->initial_mask,"mask1") == 0) ret = 1; while(1) { switch(ret) { case 1: pvStatusMessage(p,-1,-1,-1,"mask1"); ret = show_mask1(p); break; default: return 0; } } } #ifdef USE_INETD int main(int ac, char **av) { PARAM p; pvInit(ac,av,&p); /* here you may interpret ac,av and set p->user to your data */ pvMain(&p); return 0; } #else // multi threaded server int main(int ac, char **av) { PARAM p; int s,i; pvInit(ac,av,&p); /* here you may interpret ac,av and set p->user to your data */ for(i=1; i<ac; i++) { if(strcmp(av[i],"-1") == 0) { s = pvAccept(&p); if(s > 0) { p.s = s; p.free = 0; pvMain(&p); } else { printf("pvAccept error\n"); } return 0; } } while(1) { s = pvAccept(&p); if(s != -1) pvCreateThread(&p,s); else break; } return 0; } #endif