主頁 >  其他 > Linux -- 多行程編程之 - 僵尸行程

Linux -- 多行程編程之 - 僵尸行程

2021-11-15 13:23:23 其他

內容概要

  • 一、僵尸行程產生原因
  • 二、僵尸行程的危害
  • 三、僵尸行程避免
    • 3.1、方式一:呼叫wait()/waitpid()函式
    • 3.2、方式二:呼叫signal()函式注冊信號SIGCHLD的處理操作
    • 3.3、方式三:多次fork()并產生孤兒行程

一、僵尸行程產生原因

??僵尸行程:行程結束,父行程沒有對其資源回收,

??僵尸行程的產生:

1、子行程先于父行程結束
2、父行程不結束/不退出 ?? —>不會被init收養/不會被init回收
3、父行程不執行wait等函式 —> wait 等函式用于回收子行程

??1、僵尸行程測驗示例如下所示,

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, const char *argv[])
{
    /* 定義行程PID記錄的變數 */
    pid_t pid = 0;
    /* 輸出除錯陳述句 */
    printf("Zombie process test!\n");

    /* 呼叫fork()函式創建行程 */
    pid = fork();
    /* 函式回傳值判斷 */
    if (pid == -1) /* 回傳錯誤 */
    {
        perror("fork error");
        return -1;
    }
    else if (pid == 0) /* 子行程 */
    {
        /* 子行程 */
        printf("I'm child, my PID = %d, my parent PID = %d\n", getpid(), getppid());
    }
    else /* 父行程 */
    {
        sleep(1); /* 延時片刻,保證子行程先運行 */
        printf("I'm parent, return PID = %d, parent pid = %d\n", pid, getpid());

        while (1); /* 父行程保持不退出 */
    }

    return 0;
}

??編譯上述程式并行程運行之后,顯示效果下圖1.2所示,

圖1.2 測驗程式運行效果

??此時在另外一個終端可以查看當前行程的狀態,使用指令ps -ajx 查看,顯示效果下圖1.3所示,

圖1.3 程式運行效果

??ps工具標識行程的5種狀態碼表示如下所示,

D?不可中斷狀態?uninterruptible sleep (usually IO)
R?運行狀態?runnable (on run queue)
S?中斷狀態?sleeping
T?停止狀態?traced or stopped
Z?僵死狀態?a defunct (”zombie”) process

二、僵尸行程的危害

??unix提供了一種可以保證父行程獲取子行程結束時的狀態資訊的機制,也就是:

??任何一個子行程(init除外)在退出的時候,內核釋放該行程所有的資源,包括打開的檔案,占用的記憶體等,但是仍然會保留一些資訊(包括行程號退出狀態運行時間等),稱為僵尸行程(Zombie)的資料結構,直到父行程通過 wait()waitpid() 來取時才被釋放,

??但問題時如果父行程不呼叫 wait()waitpid() 的話, 那保留的資訊就不會被釋放,其行程號就會一直被占用,但是系統所能使用的行程號是有限的,如果大量的產生僵死行程,將因為沒有可用的行程號而導致系統不能產生新的行程,

??綜上所示,僵尸行程的危害一般為:

1、僵尸行程會造成一定的資源浪費,占用不必要的資源
2、當行程id達到了最大值的時候,因為有僵尸行程占用了部分行程id,使得無法再打開新的行程,

??所以,僵尸行程的危害是大大的,是要避免的,

說明:
??任何一個子行程(init除外)在退出之后,并非馬上就消失掉,而是留下一個稱為僵尸行程(Zombie)的資料結構,等待父行程處理,這是每個子行程在結束時都要經過的階段,如果子行程在退出之后,父行程沒有來得及處理,這時用 ps 命令就能看到子行程的狀態是“Z”,如果父行程能及時處理,用ps命令就可能來不及看到子行程的僵尸狀態,但這并不意味著子行程不經過僵尸狀態,
??
??如果父行程在子行程結束之前退出(即孤兒行程),則子行程將由init接管,init將會以父行程的身份對僵尸狀態的子行程進行處理,

三、僵尸行程避免

3.1、方式一:呼叫wait()/waitpid()函式

??可以通過在父行程中呼叫wait()函式或者waitpid()函式,使得在子行程退出的時刻被父行程回收即可,

??1、wait()waitpid()函式原型如下所示,

#include <sys/types.h>
#include <sys/wait.h>

pid_t wait(int *wstatus);

pid_t waitpid(pid_t pid, int *wstatus, int options);

??2、wait()waitpid()函式說明如下所示,

??pid_t wait(int *wstatus)函式說明,

功能
??wait()函式用于使父行程(也就是呼叫wait()的行程)阻塞,直到一個子行程結束或者該行程接到了一個指定的信號為止,如果該父行程沒有子行程或者他的子行程已經結束,則wait()會立即回傳-1
引數
??wstatus:指向的整形物件來保存子行程結束時的狀態,另外子行程的結束狀態可由Linux中一些特定的宏來測定,
回傳值
??成功:已回收的子行程的行程等
??失敗:-1

??pid_t waitpid(pid_t pid, int *wstatus, int options)函式說明,

功能
??waitpid()的作用和wait()一樣,但它并不一定等待第一個終止的子行程,waitpid()有若干選項,可提供一個非阻塞版本的wait()功能,實際上wait()函式只是waitpid()函式的一個特例,在Linux內部實作wait()函式時直接呼叫的就是waitpid()函式,
引數
??pid:引數pid的值有下面幾種情況,分別表示為:
????pid < -1回收其組ID等于pid的絕對值的任一子行程
????pid = -1回收任何一個子行程,此時和wait()作用—樣
????pid = 0回收其組ID等于呼叫行程的組ID的任一子行程
????pid > 0回收行程ID等于pid的子行程
??wstatus:與wait()函式中引數相同
??options:引數options的值等于或等于以下零個或多個常數,分別為:
????WNOHANG:如果指定的子行程沒有結束,則waitpid()函式不阻塞立即回傳,且回傳值為0
????WUNTRACED:由pid指定的任意子行程如果已經被暫停,且其狀態子暫停以來還沒有報告過,則回傳其狀態
????WCONTINUED(自Linux 2.6.10起) :如果已經停止的子行程通過傳遞的SIGCONT恢復,則回傳其狀態
回傳值
??> 0:已經結束的子行程的行程號
??= 0:使用選項WNOHANG且沒有子行程退出
??=-1:發生錯誤

??3、wait()waitpid()函式示例如下所示,

#include <stdio.h>
#include <stdlib.h>    /* exit    */
#include <sys/types.h> /* waitpid */
#include <sys/wait.h>  /* waitpid */
#include <unistd.h>    /* getpid等 */

int main(int argc, const char *argv[])
{
    /* 定義行程PID記錄的變數 */
    pid_t pid = 0;
    /*  定義接收行程退出時候的狀態 */
    int status = 0;
    /* 定義一個函式的回傳值 */
    pid_t retval = 0;
    /* 輸出除錯陳述句 */
    printf("Zombie process test!\n");

    /* 呼叫fork()函式創建行程 */
    pid = fork();
    /* 函式回傳值判斷 */
    if (pid == -1) /* 回傳錯誤 */
    {
        perror("fork error");
        return -1;
    }
    else if (pid == 0) /* 子行程 */
    {
        /* 子行程 */
        printf("I'm child, my PID = %d, my parent PID = %d\n", getpid(), getppid());
        /* 子行程延時片刻 */
        printf("sleep(5) ...\n");
        sleep(5);
        /* 呼叫函式退出子行程 */
        exit(EXIT_SUCCESS);
    }
    else /* 父行程 */
    {
        printf("I'm parent, return PID = %d, my pid = %d\n", pid, getpid());

        /************************************************************************
        *  情景一:回收任意一個子行程
        *  如果不關注子行程退出狀態,則引數status可為NULL,下同
        *************************************************************************/
        // retval = wait(&status); /* 或者使用 wait(NULL); */
        // retval = waitpid(-1, &status, 0); /* 或者使用 waitpid(-1, NULL, 0); */
        /************************************************************************
        *  情景二:回收行程ID為pid的子行程
        *************************************************************************/
        // retval = waitpid(pid, &status, 0); /* 或者使用 waitpid(pid, NULL, 0); */
        /************************************************************************
        *  情景三:組ID等于pid的絕對值的任一子行程
        *************************************************************************/
        // retval = waitpid(-pid, &status, 0); /* 或者使用 waitpid(-pid, NULL, 0); */
        /************************************************************************
        *  情景四:組ID等于呼叫行程的組ID的任一子行程
        *************************************************************************/
        retval = waitpid(0, &status, 0); /* 或者使用 waitpid(0, NULL, 0); */

        printf("Parent wait/waitpid OK, status = %d, retval = %d\n", status, retval);

        getchar(); /* 父行程保持不退出,方便查閱相關狀態 */
    }

    return 0;
}

??上面的程式撰寫了 wait()waitpid() 函式的集中情況,有興趣的伙伴可以自行編譯并測驗,本次只測驗目前代碼中有效的部分效果,

??編譯上面的程式并執行,執行效果如下圖1.4所示,

圖1.4 程式運行效果圖

??此時在另外一個終端可以查看當前行程的狀態,使用指令ps -ajx 查看,顯示效果下圖1.5所示,

圖1.5 程式運行行程狀態效果圖

??4、waitpid()函式使用 非阻塞模式 示例如下所示,

#include <stdio.h>
#include <stdlib.h>    /* exit    */
#include <sys/types.h> /* waitpid */
#include <sys/wait.h>  /* waitpid */
#include <unistd.h>    /* getpid等 */

int main(int argc, const char *argv[])
{
    /* 定義行程PID記錄的變數 */
    pid_t pid = 0;
    /*  定義接收行程退出時候的狀態 */
    int status = 0;
    /* 定義一個函式的回傳值 */
    int retval = 0;
    /* 輸出除錯陳述句 */
    printf("Zombie process test!\n");

    /* 呼叫fork()函式創建行程 */
    pid = fork();
    /* 函式回傳值判斷 */
    if (pid == -1) /* 回傳錯誤 */
    {
        perror("fork error");
        return -1;
    }
    else if (pid == 0) /* 子行程 */
    {
        /* 子行程 */
        printf("I'm child, my PID = %d, my parent PID = %d\n", getpid(), getppid());
        /* 子行程延時片刻 */
        printf("sleep(5) ...\n");
        sleep(5);
        /* 呼叫函式退出子行程 */
        exit(EXIT_SUCCESS);
    }
    else /* 父行程 */
    {
        usleep(20); /* 延時片刻,保證子行程先運行 */
        printf("I'm parent, return PID = %d, parent pid = %d\n", pid, getpid());

        /**************************************************************
         *  使用選項 WNOHANG 設定為非阻塞
         *  如果需要回收多個子行程,那么可以使用下面的方式進行逐個回收
         **************************************************************/
        while ((retval = waitpid(-1, &status, WNOHANG)) == 0)
        {
            printf("my PID = %d, retval = %d\n", getpid(), retval);
            sleep(1);
        }

        printf("Parent wait/waitpid OK, status = %d, retval = %d\n", status, retval);

        getchar(); /* 父行程保持不退出,方便查閱相關狀態 */
    }

    return 0;
}

??編譯上面的程式并執行,執行效果如下圖1.6所示,

圖1.6 程式運行效果圖

3.2、方式二:呼叫signal()函式注冊信號SIGCHLD的處理操作

??在子行程狀態變化的時候,父行程會收到SIGCHLD信號,Linux系統提供了一個信號處理函式signal(函式原型如下所示),那么想要避免僵尸行程產生,我們可以從此信號入手進行相關的操作,

??1、如果父行程不關注子行程的退出狀態,那么在創建子行程的時候告訴系統,所以在子行程退出之后,系統不再等待父行程行程相關資源的回收,而是直接將此子行程回收,

signal(SIGCLD, SIG_IGN);signal(SIGCHLD, SIG_IGN);

??2、如果父行程需要關注子行程的退出狀態,但是父行程同時需要處理大量的業務,并且因為 wait() 函式會阻塞,那么可以用 signal() 函式為 SIGCHLD 信號注冊 handler 方法,在父行程收到該信號,在 handler 中呼叫 wait/waitpid 進行回收,

signal(SIGCHLD, sighandler);

#include <signal.h>

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

引數:
??signum:指定信號的代碼
??handler:有三種可選值
????1、SIG_IGN:忽略改信號
????2、SIG_DFL:采用系統默認的方式進行信號處理
????3、自定義的信號處理函式
回傳值:
??成功:以前的信號處理函式
??錯誤:-1

說明:
????typedef void (*sighandler_t)(int);
??等價于:
????typedef void (*)(int) sighandler_t;
??所以為了便于理解,上面的函式可以寫為:
????sighandler_t signal(int signum, void (*handler)(int));
??該函式第二個引數和回傳值型別都是指向一個無回傳值并且帶一個整形引數的函式的指標,

??那么下面就上述兩種場景分別行程代碼測驗,

?? 1、使用 signal 函式忽略子行程退出的信號,由 init 行程回收子行程的資源,

#include <signal.h> /* signal */
#include <stdio.h>
#include <stdlib.h>    /* exit    */
#include <sys/types.h> /* waitpid */
#include <sys/wait.h>  /* waitpid */
#include <unistd.h>    /* getpid等 */

int main(int argc, const char *argv[])
{
    /* 定義行程PID記錄的變數 */
    pid_t pid = 0;
    /*  定義接收行程退出時候的狀態 */
    int status = 0;

    /* 輸出除錯陳述句 */
    printf("Zombie process test!\n");

    /* 使用信號,忽略子行程退出的信號 */
    signal(SIGCHLD, SIG_IGN);

    /* 呼叫fork()函式創建行程 */
    pid = fork();
    /* 函式回傳值判斷 */
    if (pid == -1) /* 回傳錯誤 */
    {
        perror("fork error");
        return -1;
    }
    else if (pid == 0) /* 子行程 */
    {
        /* 子行程 */
        printf("I'm child, my PID = %d, my parent PID = %d\n", getpid(), getppid());
        /* 子行程延時片刻 */
        printf("sleep(5) ...\n");
        sleep(5);
        printf("I'm child, The time has come and I'm going to quit.\n");
        /* 呼叫函式退出子行程 */
        exit(EXIT_SUCCESS);
    }
    else /* 父行程 */
    {
        usleep(20); /* 延時片刻,保證子行程先運行 */

        printf("I'm parent, return PID = %d, my pid = %d\n", pid, getpid());

        getchar(); /* 父行程保持不退出,方便查閱相關狀態 */
    }

    return 0;
}

??編譯上面的程式并執行,執行效果如下圖1.7所示,

圖1.7 程式運行效果圖

??此時在另外一個終端可以查看當前行程的狀態,使用指令ps -ajx 查看,顯示效果下圖1.8所示,

圖1.8 程式運行行程狀態效果圖

?? 2、進行 signal() 函式為 SIGCHLD 信號注冊 handler 方法回收子行程的資源,

注意:
??相對于上面的代碼,在進行 signal() 函式為 SIGCHLD 信號注冊 handler 方法,
需要注意的是,子行程狀態變化的時候父行程會收到SIGCHLD信號,而在子行程中呼叫 sleep() 函式將行程狀態變為了 睡眠狀態,此時父行程同樣會收到 SIGCHLD 信號,如果此時進行資源回收,可能會產生意想不到的后果,

??綜上所述,測驗程式如下所示,

#include <signal.h> /* signal */
#include <stdio.h>
#include <stdlib.h>    /* exit    */
#include <sys/types.h> /* waitpid */
#include <sys/wait.h>  /* waitpid */
#include <unistd.h>    /* getpid等 */

void func_handler(int signo)
{
    /*  定義接收行程退出時候的狀態 */
    int status = 0;
    /*  定義接收函式回傳的狀態 */
    pid_t retval = 0;

    /* 呼叫waitpid回收子行程,如果使用wait則會阻塞 */
    while ((retval = waitpid(-1, &status, WNOHANG)) > 0)
        printf("Parent wait/waitpid OK, status = %d, retval = %d\n", status, retval);
}

int main(int argc, const char *argv[])
{
    /* 定義行程PID記錄的變數 */
    pid_t pid = 0;

    /* 輸出除錯陳述句 */
    printf("Zombie process test!\n");

    /* 使用信號 */
    signal(SIGCHLD, func_handler);

    /* 創建3個行程行程多行程測驗 */
    for (int i = 0; i < 3; i++)
    {
        /* 呼叫fork()函式創建行程 */
        pid = fork();
        /* 函式回傳值判斷 */
        if (pid == -1) /* 回傳錯誤 */
        {
            perror("fork error");
            return -1;
        }
        else if (pid == 0) /* 子行程 */
        {
            unsigned long n = 0, m = 0;
            /* 子行程 */
            printf("I'm child, my PID = %d, my parent PID = %d\n", getpid(), getppid());
            /* 子行程延時片刻 */
            printf("sleep(5) ...\n");
            /* 呼叫sleep函式會改變行程的狀態并向父行程發送SIGCHLD信號 */
            // sleep(5);
            /* 此處根據自己真實環境撰寫模擬延時功能,延時時間大概為5秒,可自行調整 */
            while (n < 50000)
            {
                if (m > 100000)
                    m = 0, n++;
                m++;
            }
            printf("I'm child, The time has come and I'm going to quit.\n");
            /* 呼叫函式退出子行程 */
            exit(EXIT_SUCCESS);
        }
        else /* 父行程 */
        {
            usleep(20); /* 延時片刻,保證子行程先運行 */

            printf("I'm parent, return PID = %d, my pid = %d\n", pid, getpid());
        }
        sleep(1);
    }
    /* 在終端輸出換行,方便行程除錯資訊的顯示觀察 */
    putchar(10);

    /* 爆出父行程不退出 */
    getchar();

    return 0;
}

??編譯上面的程式并執行,執行效果如下圖1.7所示,

圖1.9 程式運行效果圖

??此時在另外一個終端可以查看當前行程的狀態,使用指令ps -ajx 查看,顯示效果下圖1.8所示,

圖1.10 程式運行行程狀態效果圖

3.3、方式三:多次fork()并產生孤兒行程

??關于孤兒行程,請查看博文:Linux – 多行程編程之 - 基礎實作、孤兒行程

一般情況下,呼叫 fork() 函式兩次,第一次 fork 之后,在子行程中再次進行 fork,這樣在系統中就會存在三個同樣的行程,然后將第一次 fork 之后的子行程(也就是第二次 fork 的父行程)退出,那么第二次 fork 之后的子行程就會變成孤兒行程,作為孤兒行程,就會被 init 行程接管,在行程退出后,init 行程回收其資源,

??但是需要注意的是,第一次 fork 之后的子行程退出后,也是需要回收的,那么此回收作業就需要第一次 fork 的父行程進行回收,不然同樣會產生僵尸行程,

??綜上所述,測驗程式如下所示,

#include <stdio.h>
#include <stdlib.h>    /* exit    */
#include <sys/types.h> /* waitpid */
#include <sys/wait.h>  /* waitpid */
#include <unistd.h>    /* getpid等 */

int Create_Second_SubProc()
{
    /* 定義行程PID記錄的變數 */
    pid_t pid_second = 0;

    /* 呼叫fork()函式創建第二代子行程行程 */
    pid_second = fork();
    if (pid_second == -1) /* 回傳錯誤 */
    {
        perror("2nd fork error");
        return -1;
    }
    else if (pid_second == 0) /* 子行程 */
    {
        /* 子行程 */
        printf("I'm 2nd child, my PID = %d, my parent PID = %d\n", getpid(), getppid());
        /* 子行程延時片刻 */
        printf("sleep(5) ...\n");
        sleep(5);
        printf("I'm 2nd child, The time has come and I'm going to quit.\n");
        /* 呼叫函式退出子行程 */
        exit(EXIT_SUCCESS);
    }
    else /* 父行程 */
    {
        /* 創建成功,此處是一代子行程的代碼 */
        printf("I'm 2nd parent, return PID = %d, my pid = %d\n", pid_second, getpid());
        /* 呼叫函式退出子行程 */
        exit(EXIT_SUCCESS);
    }
}

int main(int argc, const char *argv[])
{
    /* 定義行程PID記錄的變數 */
    pid_t pid_first = 0;

    /*  定義接收行程退出時候的狀態 */
    int status = 0;
    /*  定義接收函式回傳的狀態 */
    pid_t retval = 0;

    /* 輸出除錯陳述句 */
    printf("Zombie process test!\n");

    /* 呼叫fork()函式創建新的子行程 */
    pid_first = fork();
    /* 函式回傳值判斷 */
    if (pid_first == -1) /* 回傳錯誤 */
    {
        perror("1st fork error");
        return -1;
    }
    else if (pid_first == 0) /* 子行程 */
    {
        /* 子行程 */
        printf("I'm 1st child, my PID = %d, my parent PID = %d\n", getpid(), getppid());
        /* 子行程延時片刻 */
        printf("sleep(5) ...\n");
        sleep(5);
        /* 呼叫函式再次創建子行程 */
        Create_Second_SubProc();
    }
    else /* 父行程 */
    {
        usleep(20); /* 延時片刻,保證子行程先運行 */

        printf("I'm parent, return PID = %d, my pid = %d\n", pid_first, getpid());

        /* 一代子行程退出后,父行程必須要行程回收,不然就成為僵尸行程 */
        if (waitpid(pid_first, &status, 0) == pid_first)
        {
            printf("I'm parent, 1st child wait success. status = %d\n", status);
        }

        getchar(); /* 父行程保持不退出,方便查閱相關狀態 */
    }

    return 0;
}

??編譯上面的程式并執行,執行效果如下圖1.7所示,

圖1.11 程式運行效果圖

??此時在另外一個終端可以查看當前行程的狀態,使用指令ps -ajx 查看,顯示效果下圖1.8所示,

圖1.12 程式運行行程狀態效果圖

??
??好啦,廢話不多說,總結寫作不易,如果你喜歡這篇文章或者對你有用,請動動你發財的小手手幫忙點個贊,當然 關注一波 那就更好了,就到這兒了,么么噠(*  ̄3)(ε ̄ *),

? ?

上一篇:Linux – 多行程編程之 - 基礎實作、孤兒行程
下一篇:Linux – 多行程編程之 - 守護行程

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/357236.html

標籤:其他

上一篇:第二章:阿里云ECS服務器(G5)安裝配置docker

下一篇:【詳細代碼注釋】基于CNN卷積神經網路實作隨機森林演算法

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more