中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

        EEPW首頁 > 手機與無線通信 > 設計應用 > 監(jiān)視嵌入式系統(tǒng)內進程間通信的技術原理介紹

        監(jiān)視嵌入式系統(tǒng)內進程間通信的技術原理介紹

        作者: 時間:2012-09-02 來源:網絡 收藏

        本文詳細描述了一種利用 ptrace 調用,實現內部方法,并提供了相應的實現方案。
        概述

        本文引用地址:http://www.antipu.com.cn/article/154010.htm

        復雜的中,常常同時運行著相當多的。這些之間頻繁的進行著大量的動作。進程的運行狀態(tài)與這些不斷發(fā)生的有著直接和緊密的聯(lián)系。通過對進程間通信的,開發(fā)人員可以掌控系統(tǒng)內部運轉的狀態(tài)。發(fā)現錯誤時,利用獲取到的進程間通信的信息,調試工程師更容易發(fā)現問題之所在。

        但是,系統(tǒng)與開發(fā)人員的接口往往較為單一。開發(fā)人員廣泛使用通常是基于串口或是網絡接口的終端( console )方式。在這個模式下,開發(fā)人員難以細致準確的觀察進程間的通信。而且對于計算能力薄弱的嵌入式系統(tǒng)來說,在終端上打印出通信報文既會影響系統(tǒng)內部的運行,同時,也會使屏幕上充斥的過多的無用信息,使開發(fā)人員的分析工作無從下手。

        為了解決這個問題,在嵌入式 Linux 的平臺上,我們開發(fā)了一整套用于嵌入式系統(tǒng)內進程間通信的軟件,用于調試我們開發(fā)的嵌入式產品。本文詳細了監(jiān)視嵌入式系統(tǒng)內進程間通信的和實現監(jiān)視軟件的推薦方案。

        監(jiān)視方法的基本

        Linux 中的 ptrace 系統(tǒng)調用是監(jiān)視進程間通信的關鍵。 ptrace 為我們提供了一種觀察和控制其它進程的方法。利用 ptrace ,我們可以截獲正在運行的進程的所有的系統(tǒng)調用。所謂截獲是指,監(jiān)視程序可以在這些系統(tǒng)調用發(fā)生和退出時,獲得系統(tǒng)調用的參數,甚至修改參數。這些系統(tǒng)調用包括: read , write , sendto, recv 等等。在 Linux 中,用戶可以通過“ man syscalls ”來查看當前版本的 Linux 所支持的系統(tǒng)調用。

        在我們的 Linux 嵌入式產品中, AF_UNIX 域的 socket 被廣泛使用。它被用來完成進程間通信的工作。 AF_UNIX 域的 socket 的編程模型與通常的 socket 編程模型完全相同。我們的使用方法是:接收進程創(chuàng)建一個 AF_UNIX 域的 socket ,設定其模式為數據報( SOCK_DGRAM )。在這之后,為其綁定一個含路徑的文件名,例如: /var/tmp/receive.unix 。這個文件名被內核用于標識socket。發(fā)送進程創(chuàng)建一個相同模式的 AF_UNIX 域的 socket 。然后,調用 sendto 向接收進程發(fā)送消息。用來標識接收進程 socket 的就是前面提到的文件名,也就是 /var/tmp/receive.unix 。而接收進程使用 recvfrom 系統(tǒng)調用,就可以收到發(fā)送進程發(fā)出的消息。

        因此,通過 ptrace ,一旦我們接管了被監(jiān)視進程的 sendto 和 recvfrom 系統(tǒng)調用,將使我們能夠截獲到使用這兩個系統(tǒng)調用進行通信的數據。

        ptrace 系統(tǒng)調用的定義如下:

        #include sys/ptrace.h>
        long int ptrace(enum __ptrace_request request, pid_t pid,
        void * addr, void * data);

        它共有四個參數。 request 的值決定 ptrace 執(zhí)行什么樣的任務。 pid 指明被追蹤的進程的 id 。 request 參數決定了是否需要一個有效的 addr 參數,還是僅用 NULL 即可。如果有必要使用有效的 addr 參數,它的含義是被追蹤的進程的進程空間的偏移量。 data 類似于 addr 參數,有時也可以使用 NULL 來代替。如果它被使用,它的含義是指向一些數據,這些數據希望被放置到被監(jiān)視的進程的用戶空間中。

        一個完整的示例代碼將向我們展示監(jiān)視進程間通信的細節(jié)和關鍵點。代碼按前后順序分段說明。

        #include stdio.h>
        #include stdlib.h>
        #include sys/ptrace.h>
        #include sys/wait.h>
        #include Linux/user.h>
        #include sys/socket.h>
        #include sys/un.h>
        #include Linux/net.h>

        為了在程序中使用 ptrace 系統(tǒng)調用,我們需要增加 ptrace.h 頭文件。為了能夠獲得截獲的系統(tǒng)調用的函數入參,我們需要使用 struct user_regs_struct 結構。它在 user.h 中被定義。由于在程序中使用了信號,因此,我們也需要 wait.h 。我們要監(jiān)視通信動作, socket.h 和 un.h 則是必不可少的。

        下面是程序的入口主函數:

        int main (int argc, char *argv[])
        {
        int status;
        int syscall_entry = 0;
        int traced_process;
        struct user_regs_struct u_in;

        status 用于記錄被監(jiān)視進程的狀態(tài)變化; syscall_entry 記錄被監(jiān)視進程當前是進入系統(tǒng)調用,還是從系統(tǒng)調用中返回; u_in 用來獲得截獲的系統(tǒng)調用的參數; traced_process 則是被監(jiān)視進程的 PID 值。

        traced_process = atoi(argv[1]); /* 從命令行得到監(jiān)視進程的PID */
        ptrace(PTRACE_ATTACH, traced_process, NULL, NULL);
        wait(status); /* 等待被監(jiān)視進程狀態(tài)變化 */
        ptrace(PTRACE_SYSCALL, traced_process, NULL, NULL);

        參數為 PTRACE_ATTACH 的 ptrace 對被監(jiān)視進程在內核中的進程結構進行修改。使被監(jiān)視進程成為當前程序的子進程。一旦被監(jiān)視進程的狀態(tài)發(fā)生變化, wait() 將返回。程序再次調用 ptrace 。這次的參數為 PTRACE_SYSCALL 。被監(jiān)視進程的進程結構再次被修改,其 trace 標志被激活。內核將在被監(jiān)視進程的每一次系統(tǒng)調用時,觸發(fā)當前程序的運行。

        While (1) {
        /* 等待被監(jiān)視程序調用系統(tǒng)調用或是發(fā)生其它狀態(tài)變化 */
        wait(status);

        /* 如果被監(jiān)視進程退出,函數返回真。程序退出 */
        if ( WIFEXITED(status) )
        break;

        ptrace(PTRACE_GETREGS, traced_process, 0, u_in);
        if (u_in.orig_eax == 102 u_in.ebx == SYS_SENDTO) {
        if (syscall_entry == 0) { /* syscall entry */
        insyscall = 1;
        printf(call sendto()n);
        }
        else { /* Syscall exit */
        Syscall_entry = 0;
        }
        }
        ptrace(PTRACE_SYSCALL, traced_process, NULL, NULL);
        } /* while */

        return 0;
        } /* main */

        linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

        上一頁 1 2 3 下一頁

        評論


        相關推薦

        技術專區(qū)

        關閉