• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            tqsheng

            go.....
            隨筆 - 366, 文章 - 18, 評(píng)論 - 101, 引用 - 0
            數(shù)據(jù)加載中……

            epoll兩種機(jī)制的區(qū)別

            7、epoll兩種機(jī)制的區(qū)別

            說(shuō)明:本文來(lái)自翻譯epoll man文檔。

            1、ETLT這兩種事件分發(fā)機(jī)制的不同。我們假定一個(gè)環(huán)境:

               1. The file descriptor that represents the read side of a pipe ( RFD ) is added inside the epoll device.

               2. Pipe writer writes 2Kb of data on the write side of the pipe.

               3. A call to epoll_wait(2) is done that will return RFD as ready file descriptor.

               4. The pipe reader reads 1Kb of data from RFD.

               5. A call to epoll_wait(2) is done.

            Edge Triggered 工作模式:

                如果我們?cè)诘?步將RFD添加到epoll描述符的時(shí)候使用了EPOLLET標(biāo)志,那么在第5步調(diào)用epoll_wait(2)之后將有可能會(huì)掛起因?yàn)槭S嗟臄?shù)據(jù)還存在于文件的輸入緩沖區(qū)內(nèi)而且數(shù)據(jù)發(fā)出端還在等待一個(gè)針對(duì)已經(jīng)發(fā)出數(shù)據(jù)的反饋信息。只有在監(jiān)視的文件句柄上發(fā)生了某個(gè)事件的時(shí)候ET工作模式才會(huì)匯報(bào)事件Edge Triggered event distribution delivers events。因此在第5步的時(shí)候調(diào)用者可能會(huì)放棄等待仍在存在于文件輸入緩沖區(qū)內(nèi)的剩余數(shù)據(jù)the caller might end up waiting for some data that is already present inside the input buffer.。在上面的例子中會(huì)有一個(gè)事件產(chǎn)生在RFD句柄上,是因?yàn)樵诘?步執(zhí)行了一個(gè)寫(xiě)操作然后事件將會(huì)在第3步被銷(xiāo)毀consumed。因?yàn)榈?步的讀取操作沒(méi)有讀空文件輸入緩沖區(qū)內(nèi)的數(shù)據(jù)因此我們?cè)诘?步調(diào)用 epoll_wait(2)完成后might lock indefinitely。epoll工作在ET模式的時(shí)候必須使用非阻塞套接口以避免由于一個(gè)文件句柄的阻塞讀/阻塞寫(xiě)操作把處理多個(gè)文件描述符的任務(wù)餓死。最好以下面的方式調(diào)用ET模式的epoll接口在后面會(huì)介紹避免可能的缺陷。

                i 基于非阻塞文件句柄

                ii 只有當(dāng)read(2)或者write(2)返回EAGAIN時(shí)才需要掛起等待(意為此時(shí),緩存區(qū)滿或無(wú)數(shù)據(jù))。

            Level Triggered 工作模式

            相反的以LT方式調(diào)用epoll接口的時(shí)候,它就相當(dāng)于一個(gè)速度比較快的poll,and can be used wherever the latter is used since it shares the same semantics。因?yàn)榧词故褂肊T模式的epoll在收到多個(gè)chunk的數(shù)據(jù)的時(shí)候仍然會(huì)產(chǎn)生多個(gè)事件Since even with the Edge Triggered epoll multiple events can be generated up on receival of multiple chunks of data。the caller has the option to specify the EPOLLONESHOT flag, to tell epoll to disable the associated file descriptor after the receival of an event with epoll_wait(2). When the EPOLLONESHOT flag is specified, it is caller responsibility to rearm(重新設(shè)置) the file descriptor using epoll_ctl(2) with EPOLL_CTL_MOD.

            2、While the usage of epoll when employed(使用) like a Level Triggered interface does have the same semantics of poll(2), an Edge Triggered usage requires more clarification(澄清) to avoid stalls(拖延) in the application event loop.

            In this example, listener is a non-blocking socket on which listen(2) has been called. The function do_use_fd() uses the new ready file descriptor until EAGAIN is returned by either read(2) or write(2). An event driven state machine(事件驅(qū)動(dòng)狀態(tài)機(jī)) application should, after having received EAGAIN, record its current state so that at the next call to do_use_fd() it will continue to read(2) or write(2) from where it stopped before.

            示例代碼

            View Code 

            struct epoll_event ev, *events;
            for(;;) {
                nfds 
            = epoll_wait(kdpfd, events, maxevents, -1);
                
            for(n = 0; n < nfds; ++n) {
                    
            if(events[n].data.fd == listener) {
                        client 
            = accept(listener, (struct sockaddr *&local,
                                        
            &addrlen);
                        
            if(client < 0){
                            perror(
            "accept");
                            
            continue;
                        }

                        setnonblocking(client);
                        ev.events 
            = EPOLLIN | EPOLLET;
                        ev.data.fd 
            = client;
                        
            if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, client, &ev) < 0{
                            fprintf(stderr, 
            "epoll set insertion error: fd=%d0,
                                    client);
                            
            return -1;
                        }

                    }

                    
            else
                        do_use_fd(events[n].data.fd);
                }

            }


            When used as an Edge triggered interface, for performance reasons, it is possible to add the file descriptor inside the epoll interface ( EPOLL_CTL_ADD ) once by specifying ( EPOLLIN|EPOLLOUT ). This allows you to avoid continuously switching between EPOLLIN and EPOLLOUT calling epoll_ctl(2) with EPOLL_CTL_MOD.



            水平觸發(fā)(LT, Level Triggered),默認(rèn)方式
            支持阻塞/非阻塞socket。
            內(nèi)核通知某fd就緒,如果不對(duì)fd操作,內(nèi)核會(huì)繼續(xù)通知
            邊緣觸發(fā)(Edge-Triggered)
            只支持非阻塞socket
            內(nèi)核通知某fd就緒,如果不對(duì)fd操作,內(nèi)核不再繼續(xù)通知

            posted @ 2012-06-26 14:14 tqsheng 閱讀(150) | 評(píng)論 (0)編輯 收藏

            epoll_create, epoll_ctl和epoll_wait 實(shí)例講解,總結(jié)得不錯(cuò)

            NAME
                   epoll - I/O event notification facility

            SYNOPSIS
                   #include <sys/epoll.h>

            DEscrīptION
                   epoll is a variant of poll(2) that can be used either as Edge or Level
                   Triggered interface and scales well to large numbers of watched fds.
                   Three system calls are provided to set up and control an epoll set:
                   epoll_create(2), epoll_ctl(2), epoll_wait(2).

                   An epoll set is connected to a file descrīptor created by epoll_create(2).   Interest for certain file descrīptors is then registered via
                   epoll_ctl(2). Finally, the actual wait is started by epoll_wait(2).

            其實(shí),一切的解釋都是多余的,按照我目前的了解,EPOLL模型似乎只有一種格式,所以大家只要參考我下面的代碼,就能夠?qū)POLL有所了解了,代碼的解釋都已經(jīng)在注釋中:

            while (TRUE)
            {
            int nfds = epoll_wait (m_epoll_fd, m_events, MAX_EVENTS, EPOLL_TIME_OUT);//等待EPOLL事件的發(fā)生,相當(dāng)于監(jiān)聽(tīng),至于相關(guān)的端口,需要在初始化EPOLL的時(shí)候綁定。
            if (nfds <= 0)
               continue;
            m_bOnTimeChecking = FALSE;
            G_CurTime = time(NULL);
            for (int i=0; i<nfds; i++)
            {
               try
               {
                if (m_events[i].data.fd == m_listen_http_fd)//如果新監(jiān)測(cè)到一個(gè)HTTP用戶連接到綁定的HTTP端口,建立新的連接。由于我們新采用了SOCKET連接,所以基本沒(méi)用。
                {
                 OnAcceptHttpEpoll ();
                }
                else if (m_events[i].data.fd == m_listen_sock_fd)//如果新監(jiān)測(cè)到一個(gè)SOCKET用戶連接到了綁定的SOCKET端口,建立新的連接。
                {
                 OnAcceptSockEpoll ();
                }
                else if (m_events[i].events & EPOLLIN)//如果是已經(jīng)連接的用戶,并且收到數(shù)據(jù),那么進(jìn)行讀入。
                {
                 OnReadEpoll (i);
                }

                OnWriteEpoll (i);//查看當(dāng)前的活動(dòng)連接是否有需要寫(xiě)出的數(shù)據(jù)。
               }
               catch (int)
               {
                PRINTF ("CATCH捕獲錯(cuò)誤\n");
                continue;
               }
            }
            m_bOnTimeChecking = TRUE;
            OnTimer ();//進(jìn)行一些定時(shí)的操作,主要就是刪除一些斷線用戶等。
            }

            其實(shí)EPOLL的精華,按照我目前的理解,也就是上述的幾段短短的代碼,看來(lái)時(shí)代真的不同了,以前如何接受大量用戶連接的問(wèn)題,現(xiàn)在卻被如此輕松的搞定,真是讓人不得不感嘆。

            今天搞了一天的epoll,想做一個(gè)高并發(fā)的代理程序。剛開(kāi)始真是郁悶,一直搞不通,網(wǎng)上也有幾篇介紹epoll的文章。但都不深入,沒(méi)有將一些注意的地方講明。以至于走了很多彎路,現(xiàn)將自己的一些理解共享給大家,以少走彎路。

            epoll用到的所有函數(shù)都是在頭文件sys/epoll.h中聲明,有什么地方不明白或函數(shù)忘記了可以去看一下。
            epoll和select相比,最大不同在于:

            1epoll返回時(shí)已經(jīng)明確的知道哪個(gè)sokcet fd發(fā)生了事件,不用再一個(gè)個(gè)比對(duì)。這樣就提高了效率。
            2select的FD_SETSIZE是有限止的,而epoll是沒(méi)有限止的只與系統(tǒng)資源有關(guān)。

            1、epoll_create函數(shù)
            函數(shù)聲明:int epoll_create(int size)
            該 函數(shù)生成一個(gè)epoll專(zhuān)用的文件描述符。它其實(shí)是在內(nèi)核申請(qǐng)一空間,用來(lái)存放你想關(guān)注的socket fd上是否發(fā)生以及發(fā)生了什么事件。size就是你在這個(gè)epoll fd上能關(guān)注的最大socket fd數(shù)。隨你定好了。只要你有空間。可參見(jiàn)上面與select之不同2.

            22、epoll_ctl函數(shù)
            函數(shù)聲明:int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
            該函數(shù)用于控制某個(gè)epoll文件描述符上的事件,可以注冊(cè)事件,修改事件,刪除事件。
            參數(shù):
            epfd:由 epoll_create 生成的epoll專(zhuān)用的文件描述符;
            op:要進(jìn)行的操作例如注冊(cè)事件,可能的取值EPOLL_CTL_ADD 注冊(cè)、EPOLL_CTL_MOD 修 改、EPOLL_CTL_DEL 刪除

            fd:關(guān)聯(lián)的文件描述符;
            event:指向epoll_event的指針;
            如果調(diào)用成功返回0,不成功返回-1

            用到的數(shù)據(jù)結(jié)構(gòu)
            typedef union epoll_data {
            void *ptr;
            int fd;
            __uint32_t u32;
            __uint64_t u64;
            } epoll_data_t;

            struct epoll_event {
            __uint32_t events; /* Epoll events */
            epoll_data_t data; /* User data variable */
            };


            如:
            struct epoll_event ev;
            //設(shè)置與要處理的事件相關(guān)的文件描述符
            ev.data.fd=listenfd;
            //設(shè)置要處理的事件類(lèi)型
            ev.events=EPOLLIN|EPOLLET;
            //注冊(cè)epoll事件
            epoll_ctl(epfd,EPOLL_CTL_ADD,listenfd,&ev);


            常用的事件類(lèi)型:
            EPOLLIN :表示對(duì)應(yīng)的文件描述符可以讀;
            EPOLLOUT:表示對(duì)應(yīng)的文件描述符可以寫(xiě);
            EPOLLPRI:表示對(duì)應(yīng)的文件描述符有緊急的數(shù)據(jù)可讀
            EPOLLERR:表示對(duì)應(yīng)的文件描述符發(fā)生錯(cuò)誤;
            EPOLLHUP:表示對(duì)應(yīng)的文件描述符被掛斷;
            EPOLLET:表示對(duì)應(yīng)的文件描述符有事件發(fā)生;


            3、epoll_wait函數(shù)
            函數(shù)聲明:int epoll_wait(int epfd,struct epoll_event * events,int maxevents,int timeout)
            該函數(shù)用于輪詢I/O事件的發(fā)生;
            參數(shù):
            epfd:由epoll_create 生成的epoll專(zhuān)用的文件描述符;
            epoll_event:用于回傳代處理事件的數(shù)組;
            maxevents:每次能處理的事件數(shù);
            timeout:等待I/O事件發(fā)生的超時(shí)值(單位我也不太清楚);-1相當(dāng)于阻塞,0相當(dāng)于非阻塞。一般用-1即可
            返回發(fā)生事件數(shù)。


            用法如下:

            /*build the epoll enent for recall */
            struct epoll_event ev_read[20];
            int nfds = 0; //return the events count
            nfds=epoll_wait(epoll_fd,ev_read,20, -1);
            for(i=0; i
            {
            if(ev_read[i].data.fd == sock)// the listener port hava data
            ......

            epoll_wait運(yùn)行的原理是
            等侍注冊(cè)在epfd上的socket fd的事件的發(fā)生,如果發(fā)生則將發(fā)生的sokct fd和事件類(lèi)型放入到events數(shù)組中。
            并 且將注冊(cè)在epfd上的socket fd的事件類(lèi)型給清空,所以如果下一個(gè)循環(huán)你還要關(guān)注這個(gè)socket fd的話,則需要用epoll_ctl(epfd,EPOLL_CTL_MOD,listenfd,&ev)來(lái)重新設(shè)置socket fd的事件類(lèi)型。這時(shí)不用EPOLL_CTL_ADD,因?yàn)閟ocket fd并未清空,只是事件類(lèi)型清空。這一步非常重要。
            俺最開(kāi)始就是沒(méi)有加這個(gè),白搞了一個(gè)上午。

            4單個(gè)epoll并不能解決所有問(wèn)題,特別是你的每個(gè)操作都比較費(fèi)時(shí)的時(shí)候,因?yàn)閑poll是串行處理的。
            所以你還是有必要建立線程池來(lái)發(fā)揮更大的效能。

            //////////////////////////////////////////////////////////////////////////////
            man中給出了epoll的用法,example程序如下:
                   for(;;) {
                       nfds = epoll_wait(kdpfd, events, maxevents, -1);

                       for(n = 0; n < nfds; ++n) {
                           if(events[n].data.fd == listener) {
                               client = accept(listener, (struct sockaddr *) &local,
                                               &addrlen);
                               if(client < 0){
                                   perror("accept");
                                   continue;
                               }
                               setnonblocking(client);
                               ev.events = EPOLLIN | EPOLLET;
                               ev.data.fd = client;
                               if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, client, &ev) < 0) {
                                   fprintf(stderr, "epoll set insertion error: fd=%d\n",
                                           client);
                                   return -1;
                               }
                           }
                           else
                               do_use_fd(events[n].data.fd);
                       }
                   }
            此時(shí)使用的是ET模式,即,邊沿觸發(fā),類(lèi)似于電平觸發(fā),epoll中的邊沿觸發(fā)的意思是只對(duì)新到的數(shù)據(jù)進(jìn)行通知,而內(nèi)核緩沖區(qū)中如果是舊數(shù)據(jù)則不進(jìn)行通知,所以在do_use_fd函數(shù)中應(yīng)該使用如下循環(huán),才能將內(nèi)核緩沖區(qū)中的數(shù)據(jù)讀完。
                    while (1) {
                       len = recv(*******);
                       if (len == -1) {
                         if(errno == EAGAIN)
                            break;
                         perror("recv");
                         break;
                       }
                       do something with the recved data........
                    }

            在上面例子中沒(méi)有說(shuō)明對(duì)于listen socket fd該如何處理,有的時(shí)候會(huì)使用兩個(gè)線程,一個(gè)用來(lái)監(jiān)聽(tīng)accept另一個(gè)用來(lái)監(jiān)聽(tīng)epoll_wait,如果是這樣使用的話,則listen socket fd使用默認(rèn)的阻塞方式就行了,而如果epoll_wait和accept處于一個(gè)線程中,即,全部由epoll_wait進(jìn)行監(jiān)聽(tīng),則,需將listen socket fd也設(shè)置成非阻塞的,這樣,對(duì)accept也應(yīng)該使用while包起來(lái)(類(lèi)似于上面的recv),因?yàn)椋琫poll_wait返回時(shí)只是說(shuō)有連接到來(lái)了,并沒(méi)有說(shuō)有幾個(gè)連接,而且在ET模式下epoll_wait不會(huì)再因?yàn)樯弦淮蔚倪B接還沒(méi)讀完而返回,這種情況確實(shí)存在,我因?yàn)檫@個(gè)問(wèn)題而耗費(fèi)了一天多的時(shí)間,這里需要說(shuō)明的是,每調(diào)用一次accept將從內(nèi)核中的已連接隊(duì)列中的隊(duì)頭讀取一個(gè)連接,因?yàn)樵诓l(fā)訪問(wèn)的環(huán)境下,有可能有多個(gè)連接“同時(shí)”到達(dá),而epoll_wait只返回了一次。

            唯一有點(diǎn)麻煩是epoll有2種工作方式:LT和ET。

            LT(level triggered)是缺省的工作方式,并且同時(shí)支持block和no-block socket.在這種做法中,內(nèi)核告訴你一個(gè)文件描述符是否就緒了,然后你可以對(duì)這個(gè)就緒的fd進(jìn)行IO操作。如果你不作任何操作,內(nèi)核還是會(huì)繼續(xù)通知你的,所以,這種模式編程出錯(cuò)誤可能性要小一點(diǎn)。傳統(tǒng)的select/poll都是這種模型的代表.

            ET (edge-triggered)是高速工作方式,只支持no-block socket。在這種模式下,當(dāng)描述符從未就緒變?yōu)榫途w時(shí),內(nèi)核通過(guò)epoll告訴你。然后它會(huì)假設(shè)你知道文件描述符已經(jīng)就緒,并且不會(huì)再為那個(gè)文件描述符發(fā)送更多的就緒通知,直到你做了某些操作導(dǎo)致那個(gè)文件描述符不再為就緒狀態(tài)了(比如,你在發(fā)送,接收或者接收請(qǐng)求,或者發(fā)送接收的數(shù)據(jù)少于一定量時(shí)導(dǎo)致了一個(gè)EWOULDBLOCK 錯(cuò)誤)。但是請(qǐng)注意,如果一直不對(duì)這個(gè)fd作IO操作(從而導(dǎo)致它再次變成未就緒),內(nèi)核不會(huì)發(fā)送更多的通知(only once),不過(guò)在TCP協(xié)議中,ET模式的加速效用仍需要更多的benchmark確認(rèn)。

            posted @ 2012-06-26 13:32 tqsheng 閱讀(150) | 評(píng)論 (0)編輯 收藏

            slickedit的系統(tǒng)對(duì)話框資源文件在安裝目錄\macris\sysobjs,e中

            _tbcontext_form
            slickedit的系統(tǒng)對(duì)話框資源文件在安裝目錄\macris\sysobjs,e中
            自定義的對(duì)話框在用戶配置目錄下\vusrobjs.e中

            posted @ 2012-06-25 21:11 tqsheng 閱讀(298) | 評(píng)論 (0)編輯 收藏

            Visual Studio 2008 安裝的失敗與總結(jié)

            今天系統(tǒng)是剛裝的,今兒個(gè)也不是第一次裝系統(tǒng),也不是第一次裝vs2008了,遇上vs2008安裝出錯(cuò)倒是頭一回。

            先裝系統(tǒng),接著裝0ffice2007,接著裝ms sqlserver 2005,再裝adobe cs4 master套裝,一路setup,很是順利,好就差vs2008了,它一裝好,我就可以賺錢(qián)了。可結(jié)果安裝出錯(cuò)的報(bào)錯(cuò),報(bào)錯(cuò)的文檔如下:

             

            代碼

             

            我就開(kāi)始看我indows系統(tǒng)的日志,沒(méi)有任何紅色提示,但我始終不相信我的安裝文檔有問(wèn)題,因?yàn)橥滤麄円彩怯玫倪@個(gè)版本(vs 2008 team),我更不相信電腦中毒(我很少中毒,夠自信了:)),于是去網(wǎng)上查,結(jié)果答案有以下說(shuō)法:

            1、 .NET Framework 的版本問(wèn)題,要什么M$提供的官方工具.NET Framework Setup Cleanup Utility (我里面已有1.0,2.0,3.5都有了)

            2、安裝office 2007后把MSOCache刪除了(我這人潔癖這些個(gè)諸如臨時(shí)文件肯定會(huì)刪除的,這個(gè)我是有刪除過(guò)。)

            3、C:Program Files權(quán)限問(wèn)題(我是用的超級(jí)用戶,這個(gè)問(wèn)題先排除。)

            對(duì)于第一種說(shuō)法我是打算試的,可下載太慢。就跳過(guò)去了;對(duì)于第二種解決方法網(wǎng)上有三種說(shuō)法:1、把office2007卸載掉。2、把office2007重安裝一遍;這兩種都試了無(wú)效。第三種湊效了,那我就重點(diǎn)說(shuō)說(shuō)第3種吧;

            我最后成功安裝的方法詳細(xì)如下:

            1、把vs2008鏡像文件下的WCUWebDesignerCoreWebDesignerCore.EXE 手動(dòng)解壓到一個(gè)地方(注意解壓出來(lái)的文件夾里面有個(gè)Office.zh-cn)。

            2、找一個(gè)office2007光盤(pán)或光盤(pán)鏡像,找到Office.zh-cn文件夾,把該文件夾復(fù)制,然后覆蓋到上一步解壓中的Office.zh-cn中。

            3、在第一步解壓出來(lái)的文件中有個(gè)setup.exe,雙擊運(yùn)行,好像是安裝vs web 開(kāi)發(fā)什么注意,只要能安裝就行了。

            4、上一步安裝完后再運(yùn)vs2008的setup.exe.

            我的是這樣安裝完的。

            后來(lái)我想了一下我以前為什么沒(méi)出現(xiàn)這種問(wèn)題,估計(jì)是我之前安裝的順序不一樣(以前是先安裝vs2005,vs2008,mssqlserver2005,office2007.adobe)

            posted @ 2012-06-24 13:31 tqsheng 閱讀(192) | 評(píng)論 (0)編輯 收藏

            select 和 epoll

                 摘要: select 和 epoll最近有朋友在面試的時(shí)候被問(wèn)了select 和epoll效率差的原因,和一般人一樣,大部分都會(huì)回答select是輪詢、epoll是觸發(fā)式的,所以效率高。這個(gè)答案聽(tīng)上去很完美,大致也說(shuō)出了二者的主要區(qū)別。今天閑來(lái)無(wú)事,翻看了下內(nèi)核代碼,結(jié)合內(nèi)核代碼和大家分享下我的觀點(diǎn)。一、連接數(shù)我本人也曾經(jīng)在項(xiàng)目中用過(guò)select和epoll,對(duì)于select,感觸最深的是linux下se...  閱讀全文

            posted @ 2012-06-20 21:07 tqsheng 閱讀(436) | 評(píng)論 (0)編輯 收藏

            POLL, SELECT & EPOLL 原理比較分析


            因?yàn)樾枰私獾讓釉O(shè)備訪問(wèn)的原理,所以慣用高層應(yīng)用語(yǔ)言的我,需要了解一下Linux的設(shè)備訪問(wèn)機(jī)制,尤其是處理一組非阻塞IO的原理方法,標(biāo)準(zhǔn)的術(shù)語(yǔ)好像是叫多路復(fù)用。以下文章部分句子有引用之處,恕沒(méi)有一一指出出處。

             

            對(duì)于接觸過(guò)Linux內(nèi)核或設(shè)備驅(qū)動(dòng)開(kāi)發(fā)的讀者,一定清楚poll和select系統(tǒng)調(diào)用,以及從2.5版本引入的epoll機(jī)制(epoll機(jī)制包含三個(gè)系統(tǒng)調(diào)用)。網(wǎng)上關(guān)于它們的文章,有說(shuō)用法的,甚為詳細(xì),更有分析源代碼的,又比較深入,且枝節(jié)頗多。經(jīng)過(guò)幾篇文章的閱讀,我把覺(jué)得比較核心的東西寫(xiě)下來(lái)吧。我的用意是盡可能以簡(jiǎn)單的概念,比對(duì)他們?nèi)叩漠愅?/span>

             

            幾經(jīng)查找我才確定下來(lái),poll和select應(yīng)該被歸類(lèi)為這樣的系統(tǒng)調(diào)用,它們可以阻塞地同時(shí)探測(cè)一組支持非阻塞的IO設(shè)備,是否有事件發(fā)生(如可讀,可寫(xiě),有高優(yōu)先級(jí)的錯(cuò)誤輸出,出現(xiàn)錯(cuò)誤等等),直至某一個(gè)設(shè)備觸發(fā)了事件或者超過(guò)了指定的等待時(shí)間——也就是它們的職責(zé)不是做IO,而是幫助調(diào)用者尋找當(dāng)前就緒的設(shè)備。同類(lèi)型的產(chǎn)品是Windows的IOCP,它也是處理多路復(fù)用,只是把IO和探測(cè)封裝在了一起了。

             

            準(zhǔn)備的知識(shí)有兩點(diǎn):1、fd;2、op->poll。

            在Linux里面,設(shè)備都被抽象為文件,一系列的設(shè)備文件就有自己獨(dú)立的虛擬文件系統(tǒng),所以,設(shè)備在系統(tǒng)調(diào)用參數(shù)中的表示就是file description。fd其實(shí)就是一個(gè)整數(shù)(特別地,標(biāo)準(zhǔn)輸入,輸出,錯(cuò)誤輸出分別對(duì)應(yīng)的fd是0,1,2)。與內(nèi)核打交道的時(shí)候,傳遞整數(shù)的fd可以在自己的文件系統(tǒng)中作進(jìn)一步的檢查是否合法,如果只是返回指針就不能這樣操作了,畢竟指針是無(wú)差別無(wú)意義的。

            通過(guò)fd訪問(wèn)file,通過(guò)file可以訪問(wèn)其fileOperator,這里面我們要關(guān)心的一個(gè)fileOp就是poll。因?yàn)橄到y(tǒng)調(diào)用poll和select,就是依靠這個(gè)文件操作poll實(shí)現(xiàn)的。poll文件操作有兩個(gè)參數(shù),一個(gè)是文件本身,一個(gè)可以看做是當(dāng)設(shè)備尚未就緒時(shí)調(diào)用的回調(diào)函數(shù),這個(gè)函數(shù)是把設(shè)備自己特有的等待隊(duì)列傳給內(nèi)核,讓內(nèi)核把當(dāng)前的進(jìn)程掛載到其中(因?yàn)楫?dāng)設(shè)備就緒時(shí),設(shè)備就應(yīng)該去喚醒在自己特有等待隊(duì)列中的所有節(jié)點(diǎn),這樣當(dāng)前進(jìn)程就獲取了完成的信號(hào)了)。poll文件操作返回的必須是一組標(biāo)準(zhǔn)的掩碼,其中的各個(gè)位指示當(dāng)前的不同的就緒狀態(tài)(全0為沒(méi)有任何事件觸發(fā))。

             

            再談?wù)勗缙诙嗦窂?fù)用的版本poll和select。

            本質(zhì)而言,poll和select的共同點(diǎn)就是,對(duì)全部指定設(shè)備做一次poll,當(dāng)然這往往都是還沒(méi)有就緒的,那就會(huì)通過(guò)回調(diào)函數(shù)把當(dāng)前進(jìn)程注冊(cè)到設(shè)備的等待隊(duì)列,如果所有設(shè)備返回的掩碼都沒(méi)有顯示任何的事件觸發(fā),就去掉回調(diào)函數(shù)的函數(shù)指針,進(jìn)入有限時(shí)的睡眠狀態(tài),再恢復(fù)和不斷做poll,再作有限時(shí)的睡眠,直到其中一個(gè)設(shè)備有事件觸發(fā)為止。只要有事件觸發(fā),系統(tǒng)調(diào)用返回,回到用戶態(tài),用戶就可以對(duì)相關(guān)的fd作進(jìn)一步的讀或者寫(xiě)操作了。當(dāng)然,這個(gè)時(shí)候還不是所有的設(shè)備都就緒的喔,那就得不斷地poll或者select了,而做一次這樣的系統(tǒng)調(diào)用都得輪詢所有的設(shè)備,次數(shù)是設(shè)備數(shù)*(睡眠次數(shù)-1),也就是時(shí)間復(fù)雜度是O(n),還得做幾次O(n)呢。可見(jiàn),對(duì)于現(xiàn)在普遍的服務(wù)器程序,需要同時(shí)并發(fā)監(jiān)聽(tīng)數(shù)千個(gè)連接,并且連接需要重復(fù)使用的情況,poll和select就存在這樣的性能瓶頸。另外,數(shù)千個(gè)設(shè)備fd在每次調(diào)用時(shí),都需要將其從用戶空間復(fù)制到內(nèi)核空間,這里的開(kāi)銷(xiāo)不可忽略。

             

            poll和select放在一起,是因?yàn)槠錂C(jī)制一致,而參數(shù)和數(shù)據(jù)結(jié)構(gòu)就略有不同。select一次性傳入三組作用于不同信道的設(shè)備fd,分別是輸入,輸出和錯(cuò)誤異常。各組的fd期待各組所特有的,由代碼指定的一組事件,如輸入信道期待輸入就緒,輸入掛起和錯(cuò)誤等事件。 然后,select就挑選調(diào)用者關(guān)心的fd做poll文件操作,檢測(cè)返回的掩碼,看看是否有fd所屬信道感興趣的事件,比如看看這個(gè)屬于輸出信道的fd有沒(méi)有輸出就緒等一系列的事件發(fā)生,一樣地,如果有一個(gè)fd發(fā)生感興趣事件就返回調(diào)用了。select,為了同時(shí)處理三組使用不同的事件判斷規(guī)則的fd,采用了位圖的方式表示,一組一個(gè)位圖,位長(zhǎng)度是當(dāng)中最大的fd值,上限是1024,三組就是3072,而且這還只是傳入的位圖,還有一樣大小的傳出的位圖。當(dāng)fd數(shù)越來(lái)越多時(shí),所需的存儲(chǔ)開(kāi)銷(xiāo)比較大。

             

            既然,一組fd處理起來(lái)比較粗放,那就各個(gè)fd自己準(zhǔn)備好了。poll()系統(tǒng)調(diào)用是System V的多元I/O解決方案。它有三個(gè)參數(shù),第一個(gè)是pollfd結(jié)構(gòu)的數(shù)組指針,也就是指向一組fd及其相關(guān)信息的指針,因?yàn)檫@個(gè)結(jié)構(gòu)包含的除了fd,還有期待的事件掩碼和返回的事件掩碼,實(shí)質(zhì)上就是將select的中的fd,傳入和傳出參數(shù)歸到一個(gè)結(jié)構(gòu)之下,也不再把fd分為三組,也不再硬性規(guī)定fd感興趣的事件,這由調(diào)用者自己設(shè)定。這樣,不使用位圖來(lái)組織數(shù)據(jù),也就不需要位圖的全部遍歷了。按照一般隊(duì)列地遍歷,每個(gè)fd做poll文件操作,檢查返回的掩碼是否有期待的事件,以及做是否有掛起和錯(cuò)誤的必要性檢查,如果有事件觸發(fā),就可以返回調(diào)用了。

             

            回到poll和select的共同點(diǎn),面對(duì)高并發(fā)多連接的應(yīng)用情境,它們顯現(xiàn)出原來(lái)沒(méi)有考慮到的不足,雖然poll比起select又有所改進(jìn)了。除了上述的關(guān)于每次調(diào)用都需要做一次從用戶空間到內(nèi)核空間的拷貝,還有這樣的問(wèn)題,就是當(dāng)處于這樣的應(yīng)用情境時(shí),poll和select會(huì)不得不多次操作,并且每次操作都很有可能需要多次進(jìn)入睡眠狀態(tài),也就是多次全部輪詢fd,我們應(yīng)該怎么處理一些會(huì)出現(xiàn)重復(fù)而無(wú)意義的操作。

             

            這些重復(fù)而無(wú)意義的操作有:1、從用戶到內(nèi)核空間拷貝,既然長(zhǎng)期監(jiān)視這幾個(gè)fd,甚至連期待的事件也不會(huì)改變,那拷貝無(wú)疑就是重復(fù)而無(wú)意義的,我們可以讓內(nèi)核長(zhǎng)期保存所有需要監(jiān)視的fd甚至期待事件,或者可以再需要時(shí)對(duì)部分期待事件進(jìn)行修改;2、將當(dāng)前線程輪流加入到每個(gè)fd對(duì)應(yīng)設(shè)備的等待隊(duì)列,這樣做無(wú)非是哪一個(gè)設(shè)備就緒時(shí)能夠通知進(jìn)程退出調(diào)用,聰明的開(kāi)發(fā)者想到,那就找個(gè)“代理”的回調(diào)函數(shù),代替當(dāng)前進(jìn)程加入fd的等待隊(duì)列好了(這也是我后來(lái)才總結(jié)出來(lái),Linux的等待隊(duì)列,實(shí)質(zhì)上是回調(diào)函數(shù)隊(duì)列吧,也可以使用宏來(lái)將當(dāng)前進(jìn)程“加入”等待隊(duì)列,其實(shí)就是將喚醒當(dāng)前進(jìn)程的回調(diào)函數(shù)加入隊(duì)列)。這樣,像poll系統(tǒng)調(diào)用一樣,做poll文件操作發(fā)現(xiàn)尚未就緒時(shí),它就調(diào)用傳入的一個(gè)回調(diào)函數(shù),這是epoll指定的回調(diào)函數(shù),它不再像以前的poll系統(tǒng)調(diào)用指定的回調(diào)函數(shù)那樣,而是就將那個(gè)“代理”的回調(diào)函數(shù)加入設(shè)備的等待隊(duì)列就好了,這個(gè)代理的回調(diào)函數(shù)就自己乖乖地等待設(shè)備就緒時(shí)將它喚醒,然后它就把這個(gè)設(shè)備fd放到一個(gè)指定的地方,同時(shí)喚醒可能在等待的進(jìn)程,到這個(gè)指定的地方取fd就好了。我們把1和2結(jié)合起來(lái)就可以這樣做了,只拷貝一次fd,一旦確定了fd就可以做poll文件操作,如果有事件當(dāng)然好啦,馬上就把fd放到指定的地方,而通常都是沒(méi)有的,那就給這個(gè)fd的等待隊(duì)列加一個(gè)回調(diào)函數(shù),有事件就自動(dòng)把fd放到指定的地方,當(dāng)前進(jìn)程不需要再一個(gè)個(gè)poll和睡眠等待了。

             

            epoll機(jī)制就是這樣改進(jìn)的了。誠(chéng)然,fd少的時(shí)候,當(dāng)前進(jìn)程一個(gè)個(gè)地等問(wèn)題不大,可是現(xiàn)在和尚多了,方丈就不好管了。以前設(shè)備事件觸發(fā)時(shí),只負(fù)責(zé)喚醒當(dāng)前進(jìn)程就好了,而當(dāng)前進(jìn)程也只能傻傻地在poll里面等待或者循環(huán),再來(lái)一次poll,也不知道這個(gè)由設(shè)備提供的poll性能如何,能不能檢查出當(dāng)前進(jìn)程已經(jīng)在等待了就立即返回,當(dāng)然,我也不明白為什么做了一遍的poll之后,去掉回調(diào)函數(shù)指針了,還得再做,不是說(shuō)好了會(huì)去喚醒進(jìn)程的嗎?

             

            現(xiàn)在就讓事件觸發(fā)回調(diào)函數(shù)多做一步。本來(lái)設(shè)備還沒(méi)就緒就調(diào)用一個(gè)回調(diào)函數(shù)了,現(xiàn)在再在這個(gè)回調(diào)函數(shù)里面做一個(gè)注冊(cè)另一個(gè)回調(diào)函數(shù)的操作,目的就是使得設(shè)備事件觸發(fā)多走一步,不僅僅是喚醒當(dāng)前進(jìn)程,還要把自己的fd放到指定的地方。就像收本子的班長(zhǎng),以前得一個(gè)個(gè)學(xué)生地去問(wèn)有沒(méi)有本子,如果沒(méi)有,它還得等待一段時(shí)間而后又繼續(xù)問(wèn),現(xiàn)在好了,只走一次,如果沒(méi)有本子,班長(zhǎng)就告訴大家去那里交本子,當(dāng)班長(zhǎng)想起要取本子,就去那里看看或者等待一定時(shí)間后離開(kāi),有本子到了就叫醒他,然后取走。這個(gè)道理很簡(jiǎn)單,就是老師和班干們常說(shuō)的,大家多做一點(diǎn)工作,我的工作就輕松很多了,尤其是需要管理的東西越來(lái)越多時(shí)。

             

            這種機(jī)制或者說(shuō)模式,我想在Java的FutureTask里面應(yīng)該也會(huì)用到的,一堆在線程池里面跑著的線程(當(dāng)然這是任務(wù),不是線程,接口是Callable<V>,不是Runnable.run,是Callable.call,它是可以返回結(jié)果的),誰(shuí)先做好就應(yīng)該先處理呀,可是難道得一個(gè)個(gè)問(wèn)嗎?干脆就誰(shuí)好了,誰(shuí)就按照既定的操作暴露自己,這樣FutureTask的get方法就可以馬上知道當(dāng)前最先完成的線程了,就可以取此線程返回結(jié)果了。

             

            epoll由三個(gè)系統(tǒng)調(diào)用組成,分別是epoll_create,epoll_ctl和epoll_wait。epoll_create用于創(chuàng)建和初始化一些內(nèi)部使用的數(shù)據(jù)結(jié)構(gòu);epoll_ctl用于添加,刪除或者修改指定的fd及其期待的事件,epoll_wait就是用于等待任何先前指定的fd事件。

             

            關(guān)于epoll內(nèi)部的數(shù)據(jù)結(jié)構(gòu),我就不能詳細(xì)了解了。

            posted @ 2012-06-20 21:06 tqsheng 閱讀(162) | 評(píng)論 (0)編輯 收藏

            Slickedit

            主前色為白色,當(dāng)前行高亮 ,注釋的背景色去掉

            Four Ways to Use Slick-C®

            有個(gè)對(duì)話框例子

            最佳實(shí)現(xiàn)的筆記

            posted @ 2012-06-19 22:18 tqsheng 閱讀(470) | 評(píng)論 (0)編輯 收藏

            海淘

            飛利浦Philips LFH0655/27 4G錄音筆(支持關(guān)機(jī)一鍵錄)$49.95
            http://www.dzpyh.com/7816.html

            戶外自駕游好幫手 膳魔師Thermos Nissan 61盎司1.8L帝王級(jí)不銹鋼保溫壺 $25.16
            http://www.dzpyh.com/6886.html
            飛利浦Philips 1160XCC電動(dòng)剃須刀帶自動(dòng)清潔系統(tǒng)$90.99 到手約680
            http://www.dzpyh.com/7745.html

            Sony ICD-UX523BLK錄音筆

            ICD-UX523F 
            http://www.amazon.com/Thermos-Nissan-Stainless-Bottle-Folding/dp/B000U8D0H2/ref=pd_sbs_hg_17

            Havaianas哈瓦那

            posted @ 2012-05-30 22:11 tqsheng 閱讀(263) | 評(píng)論 (0)編輯 收藏

            維生素

            Triflex速效型維骨力GNC Vitamin A & D 100 Softgel CapsulesGNC Calcium Citrate 1000 180 TabletsGNC Calcimate Complete 120 CapletsGNC Calcimate Complete™ 120 Caplets補(bǔ)腦

            http://www.gnc.com/product/index.jsp?productId=2134099&kwCatId=
            Memorall
            該款產(chǎn)品隸屬GNC頂級(jí)營(yíng)養(yǎng)預(yù)防系列,是配方最全面的補(bǔ)腦配方,富含多種增強(qiáng)記憶力的營(yíng)養(yǎng)素,維生素、DHA、銀杏和膽堿等,有效補(bǔ)腦,增強(qiáng)記憶力,適合學(xué)生,白領(lǐng)腦力工作者和中老年人。
            New Chapter Neurozyme ® 天然有機(jī) 補(bǔ)腦健憶智力配方

            眼睛

             GNC bilberry
            http://www.gnc.com/product/index.jsp?productId=2133924#productTabset

            va vd
            GNC Vitamin A & D 100 Softgel Capsules美國(guó)頂級(jí)Solgar純挪威鱈魚(yú)肝油 提供VA+VD

            VC
            New Chapter Activated C Food Complex 90 tablet sizes


            GNC Calcimate Complete™ 120 Caplets
            GNC Calcium Citrate 1000 180 Tablets

            蘆薈
            GNC Natural Brand Aloe Vera Gel


            Triflex速效型維骨力

            whey protein 乳清蛋白粉
            GNC葡萄籽精華

            GNCHerbal Plus Grape Seed Extract 

            GNC葡萄籽精華

            GNC頂級(jí)護(hù)眼配方
            ocular formula

            DMAE是Dimethylaminoethanol(二甲氨基乙醇)的簡(jiǎn)稱,英文又簡(jiǎn)稱為Deanol。
            GNC補(bǔ)腦素DMAE





            posted @ 2012-05-30 21:15 tqsheng 閱讀(863) | 評(píng)論 (5)編輯 收藏

            尿酸高

            http://wenku.baidu.com/view/5de5a04f2e3f5727a5e962d2.html

            posted @ 2012-05-24 23:38 tqsheng 閱讀(143) | 評(píng)論 (0)編輯 收藏

            google.com/ncr

            google.com/ncr  不適用國(guó)家重定向 也就是不會(huì)轉(zhuǎn)到.cn上去 不過(guò)某些內(nèi)容一樣會(huì)被Block掉 

            posted @ 2012-05-13 15:59 tqsheng 閱讀(425) | 評(píng)論 (1)編輯 收藏

            美國(guó)人教你這樣用Google

            美國(guó)人教你這樣用Google,你真的會(huì)變特工!!!這...





            第一篇 

            在搜索框上輸入:“indexof/”inurl:lib 
            再按搜索你將進(jìn)入許多圖書(shū)館,并且一定能下載自己喜歡的書(shū)籍。 

            在搜索框上輸入:“indexof/”cnki 
            再按搜索你就可以找到許多圖書(shū)館的CNKI、VIP、超星等入口! 

            在搜索框上輸入:“indexof/”ppt 
            再按搜索你就可以突破網(wǎng)站入口下載powerpint作品! 

            在搜索框上輸入:“indexof/”mp3 
            再按搜索你就可以突破網(wǎng)站入口下載mp3、rm等影視作品! 

            在搜索框上輸入:“indexof/”swf 
            再按搜索你就可以突破網(wǎng)站入口下載flash作品! 

            在搜索框上輸入:“indexof/”要下載的軟件名 
            再按搜索你就可以突破網(wǎng)站入口下載軟件! 

            注意引號(hào)應(yīng)是英文的! 


            第二篇 

            用Google看世界!!! 只要你在GOOGLE里輸入特殊的關(guān)鍵字,就可以搜到數(shù)千個(gè)攝象頭的IP地址!通過(guò)他你就可以看到其所攝的實(shí)時(shí)影象!! 

            在Google里輸入 

            inurl:"viewerframe?mode=" 

            隨便打開(kāi)一個(gè),然后按提示裝一個(gè)插件,就可以看到了!!! 

            第三篇 

            三則黑客的Google搜索技巧簡(jiǎn)介 

            大家都知道,Google毫無(wú)疑問(wèn)是當(dāng)今世界上最強(qiáng)大的搜索引擎。然而,在黑客手中,它也是一個(gè)秘密武器,它能搜索到一些你意想不到的信息。賽迪編者把他們進(jìn)行了簡(jiǎn)單的總結(jié)不是希望您利用他去攻擊別人的網(wǎng)站,而是利用這些技巧去在浩如煙海的網(wǎng)絡(luò)信息中,來(lái)個(gè)大海撈針,尋找到對(duì)您有用的信息。 

            如果您是一名普通網(wǎng)民,您可以使用黑客的技巧擴(kuò)大自己的視野,提高自己的檢索效率;如果您是一名網(wǎng)管,請(qǐng)您趕快看看您的網(wǎng)站是否做好了對(duì)下面黑客探測(cè)手 段的防范措施,如果沒(méi)有就趕快來(lái)個(gè)亡羊補(bǔ)牢,畢竟隱患勝于明火,防范勝于救災(zāi);如果您是一名黑客,相信您早以在別的黑客站點(diǎn)上見(jiàn)過(guò)類(lèi)似的方法,這篇文章對(duì)您沒(méi)什么用處,這里的技巧對(duì)您是小兒科,菜鳥(niǎo)級(jí)!您可以節(jié)省寶貴的時(shí)間做更有意義的事情,這篇文章您不用看了,到別處去吧! 

            基于上面的考慮我編發(fā)了這篇文章。 

            搜索URL 

            比如我們提交這種形式:passwd.txtsite:virtualave.net 

            看到了什么?是不是覺(jué)得太不可思議了!有很多基于CGI/PHP/ASP類(lèi)型的留言板存在這種問(wèn)題。有時(shí)我們得到密碼甚至還是明碼的!管理員或許太不負(fù)責(zé)了,或許安全防范的意識(shí)太差了,如果你是網(wǎng)絡(luò)管理員,趕快檢查一下不要讓惡意攻擊者撿了便宜。不要太相信DES加密,即使我們的密碼經(jīng)過(guò)DES加密的密 碼,黑客們還是可以通過(guò)許多破解軟件來(lái)搞定。 

            這次我們能得到包含密碼的文件。“site:virtualave.net”意思是只搜索virutalave.net的URL。virutalave.net是一個(gè)網(wǎng)絡(luò)服務(wù)器提供商。 

            同樣,我們可以搜索一些頂級(jí)域名,比如:.net.org.jp.in.gr 

            config.txtsite:.jp 

            admin.txtsite:.tw 

            搜索首頁(yè)的目錄 

            首頁(yè)是非常有用的,它會(huì)提供給你許多有用的信息。 

            我們提交如下的形式: 

            "Indexof/admin" 

            "Indexof/secret" 

            "Indexof/cgi-bin"site:.edu 

            你可以自己定義搜索的首頁(yè)字符。這樣就可以獲得許多信息。 

            搜索特定的文件類(lèi)型 

            比如你想指定一種文件的類(lèi)型,可以提交如下形式: 

            filetype:.docsite:.milclassified 

            這個(gè)就是搜索軍方的資料,你可以自定義搜索。 

            第四篇 

            Google的特殊功能 

            1、查詢電話號(hào)碼 

            Google的搜索欄中最新加入了電話號(hào)碼和美國(guó)街區(qū)地址的查詢信息。 

            個(gè)人如想查找這些列表,只要填寫(xiě)姓名,城市和省份。 

            如果該信息為眾人所知,你就會(huì)在搜索結(jié)果頁(yè)面的最上方看到搜索的電話和街區(qū)地址 

            你還可以通過(guò)以下任何一種方法找到該列表: 

            名字(或首位大寫(xiě)字母),姓,電話地區(qū)號(hào) 

            名字(或首位大寫(xiě)字母),姓,郵遞區(qū)號(hào) 

            名字(或首位大寫(xiě)字母),姓,城市(可寫(xiě)州) 

            名字(或首位大寫(xiě)字母),姓,州 

            電話號(hào)碼,包括區(qū)號(hào) 

            名字,城市,州 

            名字,郵遞區(qū)號(hào) 

            2、查找PDF文件 

            現(xiàn)在GOOGLE的搜索結(jié)果中包括了PDF文件。盡管PDF文件不如HTML文件那么多,但他們經(jīng)常具備一些其他文件不具備的高質(zhì)量信息 

            為了顯示一個(gè)搜索結(jié)果是PDF文件而不是網(wǎng)頁(yè),PDF文件的標(biāo)題開(kāi)頭顯示藍(lán)色文本。 

            這就是讓你知道ACRTOBATREADER程序會(huì)啟動(dòng)來(lái)閱讀文件 

            如果你的計(jì)算機(jī)沒(méi)裝有該程序,計(jì)算機(jī)會(huì)指導(dǎo)你去能免費(fèi)下載該程序的網(wǎng)頁(yè)。 

            使用PDF文件時(shí),相關(guān)的網(wǎng)頁(yè)快照會(huì)由“TEXTVERSION”代替,它是PDF文檔的復(fù)制文件,該文件除去了所有格式化命令。 

            如果你在沒(méi)有PDF鏈接的情況下想看一系列搜索結(jié)果,只要在搜索欄中打上-inurldf加上你的搜索條件。 

            3、股票報(bào)價(jià) 

            用Google查找股票和共有基金信息,只要輸入一個(gè)或多個(gè)NYSE,NASDAQ,AMEX或 

            共有基金的股票行情自動(dòng)收錄機(jī)的代碼,也可以輸入在股市開(kāi)戶的公司名字。 

            如果Google識(shí)別出你查詢的是股票或者共有基金,它回復(fù)的鏈接會(huì)直接連到高質(zhì)量的金融信息提供者提供的股票和共有基金信息。 

            在你搜索結(jié)果的開(kāi)頭顯示的是你查詢的股市行情自動(dòng)收錄器的代碼。如果你要查找一家公司的名字(比如,INTEL),請(qǐng)查看“股票報(bào)價(jià)”在Google搜索結(jié)果的金融欄里會(huì)有那個(gè)公司的主頁(yè)的鏈接(比如, www. INTEL. COM)。 

            Google是以質(zhì)量為基礎(chǔ)來(lái)選擇和決定金融信息提供者的,包括的因素有下載速度,用戶界面及其功能。 

            4、找找誰(shuí)和你鏈接 

            有些單詞如果帶有冒號(hào)就會(huì)有特殊的意思。比如link:操作員。查詢link:siteURL,就會(huì)顯示所有指向那個(gè)URL的網(wǎng)頁(yè)。舉例來(lái)說(shuō),鏈接 www. Google. com會(huì)向你顯示所有指向GOOGLE主頁(yè)的網(wǎng)頁(yè)。但這種方法不能與關(guān)鍵字查詢聯(lián)合使用。 

            5、查找站點(diǎn) 

            單詞site后面如果接上冒號(hào)就能夠?qū)⒛愕乃阉飨薅ǖ侥硞€(gè)網(wǎng)站。具體做法是:在c搜索欄中使用site:sampledomain.com這個(gè)語(yǔ)法結(jié)構(gòu)。比如,在斯坦福找申請(qǐng)信息,輸入: 

            admissionsite: www. stanford. edu 

            6、查找字典釋意 

            查找字典釋意的方法是在搜索欄中輸入你要查詢的內(nèi)容。在我們根據(jù)要求找到所有的字典釋意都會(huì)標(biāo)有下劃線,位于搜索結(jié)果的上面,點(diǎn)擊鏈接你會(huì)找到字典提供者根據(jù)要求給出的相關(guān)定義。7、用GOOLGE查找地圖 

            想用Google查找街區(qū)地圖,在Google搜索欄中輸入美國(guó)街區(qū)地址,包括郵遞區(qū)號(hào)或城市/州(比如165大學(xué)大街PALOALTOCA)。通常情況下,街區(qū)地址和城市的名字就足夠了。 

            當(dāng)Google識(shí)別你的要求是查找地圖,它會(huì)反饋給你有高質(zhì)量地圖提供者提供的鏈接,使你直接找到相關(guān)地圖。我們是以質(zhì)量為基礎(chǔ)選擇這些地圖提供者。值得注意的是Google和使用的地圖信息提供者沒(méi)有任何關(guān)聯(lián)。 

            posted @ 2012-05-13 15:47 tqsheng 閱讀(224) | 評(píng)論 (0)編輯 收藏

            VC中如何實(shí)現(xiàn)窗口的隱藏

            用MFC做的Dialog based 程序只要在OnInitDialog()函數(shù)里面寫(xiě)如下代碼就能實(shí)現(xiàn)窗口隱藏:  
                
                SetWindowPos(&CWnd::wndNoTopMost,0,0,0,0,SWP_HIDEWINDOW);   
                ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);   

            但是在任務(wù)管理器中還能看到!

            將上述代碼寫(xiě)入一個(gè)按紐的CLICK事件中即可實(shí)現(xiàn)程序的后臺(tái)運(yùn)行,且任務(wù)管理器中不可見(jiàn)!

            下面的方法可以使窗口徹底的不可見(jiàn):

            1. 如何有效地使初始窗口不顯示
            當(dāng)我們想讓窗口初始時(shí)不顯示時(shí),通常會(huì)用ShowWindow(SW_HIDE) ,但實(shí)際上還是在啟動(dòng)是可以看到窗口一閃而過(guò)的痕跡。所以,可以使用下面的方法來(lái)實(shí)現(xiàn)它:
            (1.1)先在構(gòu)造函數(shù)中設(shè)置布樂(lè)變量 visible值為false.

            visible = false;
            (1.2)重載 WM_WINDOWPOSCHANGING,并添加下面代碼:void CTest_deleteDlg::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
            {
            if(!visible)
            lpwndpos->flags &= ~SWP_SHOWWINDOW;

            CDialog::OnWindowPosChanging(lpwndpos);
            }

            (1.3)然后設(shè)布爾visible變量值為true,并在要顯示窗口時(shí),再用ShowWindow(SW_SHOW)既可。visible = true;
            ShowWindow(SW_SHOW);

            posted @ 2012-04-27 09:45 tqsheng 閱讀(776) | 評(píng)論 (0)編輯 收藏

            一些電子書(shū)鏈接

            軟考官方指定教材及同步輔導(dǎo)書(shū)下載 | 軟考?xì)v年真是解析與答案

            軟考視頻 | 考試機(jī)構(gòu) | 考試時(shí)間安排

            Java一覽無(wú)余:Java視頻教程 | Java SE | Java EE

            .Net技術(shù)精品資料下載匯總:ASP.NET篇

            .Net技術(shù)精品資料下載匯總:C#語(yǔ)言篇

            .Net技術(shù)精品資料下載匯總:VB.NET篇

            撼世出擊:C/C++編程語(yǔ)言學(xué)習(xí)資料盡收眼底 電子書(shū)+視頻教程

            Visual C++(VC/MFC)學(xué)習(xí)電子書(shū)及開(kāi)發(fā)工具下載

            Perl/CGI腳本語(yǔ)言編程學(xué)習(xí)資源下載地址大全

            Python語(yǔ)言編程學(xué)習(xí)資料(電子書(shū)+視頻教程)下載匯總

            最新最全Ruby、Ruby on Rails精品電子書(shū)等學(xué)習(xí)資料下載

            數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)精品學(xué)習(xí)資源匯總:MySQL篇 | SQL Server篇 | Oracle篇

            ActionScript、Flex、 AIR等RIA技術(shù)相關(guān)資料下載匯總

            最強(qiáng)HTML/xHTML、CSS精品學(xué)習(xí)資料下載匯總

            最新JavaScript、Ajax典藏級(jí)學(xué)習(xí)資料下載分類(lèi)匯總

            網(wǎng)絡(luò)最強(qiáng)PHP開(kāi)發(fā)工具+電子書(shū)+視頻教程等資料下載匯總

            UML學(xué)習(xí)電子資下載匯總 軟件設(shè)計(jì)與開(kāi)發(fā)人員必備

            經(jīng)典LinuxCBT視頻教程系列 Linux快速學(xué)習(xí)視頻教程一帖通

            天羅地網(wǎng):精品Linux學(xué)習(xí)資料大收集(電子書(shū)+視頻教程) Linux參考資源大系

            Linux系統(tǒng)管理員必備參考資料下載匯總

            Linux shell、內(nèi)核及系統(tǒng)編程精品資料下載匯總

            UNIX操作系統(tǒng)精品學(xué)習(xí)資料<電子書(shū)+視頻>分類(lèi)總匯

            FreeBSD/OpenBSD/NetBSD精品學(xué)習(xí)資源索引 含書(shū)籍+視頻

            Solaris/OpenSolaris電子書(shū)、視頻等精華資料下載索引 

            posted @ 2012-04-25 10:51 tqsheng 閱讀(191) | 評(píng)論 (0)編輯 收藏

            dns ipv6

             
            畢業(yè)設(shè)計(jì)需要,要在linux下搭建一個(gè)支持ipv6的dns服務(wù)器。 具體來(lái)說(shuō)很簡(jiǎn)單,用Bind9搭建一個(gè)本機(jī)dns服務(wù)器,然后把本機(jī)dns設(shè)置成搭建的dns服務(wù)器地址,給dns服務(wù)器添加一個(gè)域名到ipv6地址的映射,然后當(dāng)本機(jī)訪問(wèn)剛剛設(shè)定域名的時(shí)候返回對(duì)應(yīng)的ipv6地址。 求詳細(xì)設(shè)置,搭建的步驟,最好自己以前做過(guò)的。不吝感謝

            問(wèn)題補(bǔ)充:

            提供一個(gè)詳細(xì)的Bind 9.6.1的named.conf配置文件和正反向區(qū)域文件即可。我安裝的是Fedora的bind-9.6.1-11.P1.fc12.i686.rpm


            這事簡(jiǎn)單啊,好好看看bind手冊(cè) http://wenku.baidu.com/view/c3e081c24028915f804dc2df.html IPv6的配置和v4差別不大,在named.conf中只是增加一條listen on ipv6 port的命令。 listen-on-v6 port 53 { 1.1.1.1; }; 正反向區(qū)域文件按照IPv4格式配就OK了。一個(gè)區(qū)別就是IPv4為A記錄,IPv6為AAAA記錄。 4.9.1 使用AAAA記錄查找地址 IPv6的AAAA記錄與IPv4的A記錄相對(duì)應(yīng),并且與被廢除的A6記錄不同,它在一個(gè)記錄中指定完整的IPv6地址。例如: $ORIGIN example.com. host 3600 IN AAAA 2001:db8::1 不推薦使用IPv6內(nèi)嵌IPv4映射地址。如果一個(gè)主機(jī)有一個(gè)IPv4地址,使用一個(gè)A記錄,而不是帶有::ffff:192.168.42.1的AAAA記錄來(lái)作為其地址。 4.9.2 使用半字節(jié)格式從地址查名字 在使用半字節(jié)格式來(lái)查找一個(gè)地址時(shí),地址元素只是簡(jiǎn)單地反轉(zhuǎn),并且在反轉(zhuǎn)之后的名字后 DOWNLOAD from WWW.AIDNS.CN 面添加ip6.arpa.,就像在IPv4中一樣。例如,下面將提供對(duì)一個(gè)地址為2001:db8::1的主機(jī)進(jìn)行反向名字查找。 $ORIGIN 0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa. 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 14400 IN PTR host.example.com.

            posted @ 2012-04-25 10:48 tqsheng 閱讀(302) | 評(píng)論 (0)編輯 收藏

            僅列出標(biāo)題
            共25頁(yè): First 9 10 11 12 13 14 15 16 17 Last 
            久久免费视频6| 狠狠色丁香婷婷久久综合五月 | 99国内精品久久久久久久| 久久婷婷人人澡人人| 1000部精品久久久久久久久| 日韩亚洲国产综合久久久| 久久久九九有精品国产| 久久这里只有精品首页| 精品国产婷婷久久久| 国产V亚洲V天堂无码久久久| 久久久久久伊人高潮影院| 久久er国产精品免费观看8| 国产精品久久久久久一区二区三区| 欧美精品国产综合久久| 久久久久久亚洲精品不卡| 青青青青久久精品国产 | 色婷婷综合久久久久中文字幕 | 国产精品久久久久久影院| 午夜人妻久久久久久久久| 久久亚洲中文字幕精品一区| 国产精品VIDEOSSEX久久发布| 99久久超碰中文字幕伊人| 三上悠亚久久精品| 久久人人爽人人爽人人片AV不| 久久久久亚洲av成人无码电影| 国产精品免费久久久久影院 | 久久人人爽人人爽人人片av高请| 久久久久久久久66精品片| 午夜福利91久久福利| 久久人人爽人人爽人人片AV麻豆| 国产精品女同一区二区久久| 2020最新久久久视精品爱| 四虎国产精品免费久久5151 | 久久不射电影网| 欧美伊香蕉久久综合类网站| 色综合久久88色综合天天| 99久久精品免费看国产| 久久精品国产一区二区| 久久综合伊人77777| 狠狠色丁香久久婷婷综合图片| 久久香综合精品久久伊人|