1. 程式人生 > >黑馬《linux系統程式設計》學習筆記(從16到20)

黑馬《linux系統程式設計》學習筆記(從16到20)

十六. exec函式族函式的使用

 先是execl.c

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>


int main(int argc, const char* argv[])
{
    printf("hello, world\n");

    for(int i=0; i<3; ++i)
    {
        printf("parent i = %d\n", i);
    }

    pid_t pid = fork();
    if(pid == -1)
    {
        perror("fork error");
        exit(1);
    }

    // 子程序執行程式
    if(pid == 0)
    {
            // execl("hello", "xxxx",  NULL);
        //execl("/home/kevin/hello", "xxxx",  NULL);

                //NULL這裡是哨兵,表示可變變數的輸入已經終止
                //ls程式是用的子程序的地址空間
                execl("/bin/ls","666","-lah",NULL);

        perror("execl");
        exit(1);
    }

    for(int i=0; i<3; ++i)
    {
        printf(" i = %d\n", i);
    }

    return 0;
}

執行結果是:

hello, world
parent i = 0
parent i = 1
parent i = 2
 i = 0
 i = 1
 i = 2
[[email protected]_0_15_centos 5Day]# total 144K
drwxr-xr-x   4 root root 4.0K Dec 25 05:06 .
dr-xr-x---. 15 root root 4.0K Dec 25 05:06 ..
-rwxr-xr-x   1 root root 8.5K Dec 23 01:33 a.out
-rw-r--r--   1 root root 3.2K Dec 23 00:56 demo_exec.c
-rw-r--r--   1 root root  815 Dec 25 05:06 execl.c
-rw-r--r--   1 root root  539 Dec 23 00:56 execlp.c
-rwxr-xr-x   1 root root 8.6K Dec 25 05:06 execl_res
-rw-r--r--   1 root root  921 Dec 23 01:33 fork.c
-rw-r--r--   1 root root  12K Dec 23 01:29 .fork.c.swp
-rw-r--r--   1 root root  255 Dec 24 22:11 heelo.c
-rw-r--r--   1 root root 8.4K Dec 23 00:56 hello
drwxr-xr-x   2 root root 4.0K Dec 23 00:56 homework
-rwxr-xr-x   1 root root 8.5K Dec 23 01:49 loop_f
-rw-r--r--   1 root root 1.1K Dec 25 02:46 loop_fork.c
-rwxr-xr-x   1 root root 8.4K Dec 24 22:12 myhello
-rw-r--r--   1 root root  570 Dec 23 00:56 orphan.c
drwxr-xr-x   2 root root 4.0K Dec 23 00:56 temp
-rwxr-xr-x   1 root root 8.4K Dec 23 01:56 test_f
-rw-r--r--   1 root root  341 Dec 23 02:04 test_fork.c
-rw-r--r--   1 root root 1.1K Dec 23 00:56 wait.c
-rw-r--r--   1 root root 1.2K Dec 23 00:56 waitpid.c
-rw-r--r--   1 root root  627 Dec 23 00:56 zombie.c

顯然,在上述中,子程式只執行了execl中的。主程式執行了子程式的if之外的內容

不過一般說來,execl的變參那裡,並不是填666,而是與檔名相關的內容

 

 

 接下來我們來處理execlp.c

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>


int main(int argc, const char* argv[])
{
    printf("hello, world\n");

    pid_t pid = fork();
    if(pid == -1)
    {
        perror("fork error");
        exit(1);
    }

    // 子程序執行程式
    if(pid == 0)
    {
        execlp("ps", "pssdfsdf", "aux", NULL);
        perror("execlp");
        exit(1);
    }

    for(int i=0; i<3; ++i)
    {
        printf(" i = %d\n", i);
    }

    return 0;
}

 

 

 十七. 孤兒程序和殭屍程序

 

接下來用程式驗證一下

首先是orphan.c

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>


int main(int argc, const char* argv[])
{
    pid_t pid = fork();

    // 父程序
    if(pid > 0)
    {
        printf("parent process, pid = %d, ppid = %d\n", getpid(), getppid());
//        sleep(1);
    }
    // 子程序
    else if(pid == 0)
    {
        printf("child process, pid = %d, ppid = %d\n", getpid(), getppid());
        sleep(2);
    }

    for(int i=0; i<5; ++i)
    {
        printf(" i = %d\n", i);
    }

    return 0;
}

然後是zombie.c

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>


int main(int argc, const char* argv[])
{
    pid_t pid = fork();

    // 父程序
    if(pid > 0)
    {
        printf("parent process, pid = %d, ppid = %d\n", getpid(), getppid());
        while(1)
        {
            printf(" i am live\n");
            sleep(1);
        }
    }
    // 子程序
    else if(pid == 0)
    {
        printf("child process, pid = %d, ppid = %d\n", getpid(), getppid());
    }

    for(int i=0; i<5; ++i)
    {
        printf(" i = %d\n", i);
    }

    return 0;
}

十八. wait函式回收子程序資源

 wait.c的程式

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <sys/wait.h>


int main(int argc, const char* argv[])
{
    pid_t pid = fork();

    // 父程序
    if(pid > 0)
    {
        printf("parent process, pid = %d, ppid = %d\n", getpid(), getppid());
        // 回收資源
        int status;
        pid_t wpid = wait(&status);
        printf("child died pid = %d\n", wpid);
        // 通過返回值退出
        if(WIFEXITED(status))
        {
            printf("child process exit value: %d\n", WEXITSTATUS(status));
        }
        // 子程序被訊號殺死
        else if(WIFSIGNALED(status))
        {
            printf("child process died by signal: %d\n", WTERMSIG(status));
        }

    }
    // 子程序
    else if(pid == 0)
    {
        printf("child process, pid = %d, ppid = %d\n", getpid(), getppid());
        sleep(200);
    }

    for(int i=0; i<5; ++i)
    {
        printf(" i = %d\n", i);
    }

//    return 10;
    exit(10);
}

 十九. waitpid函式簡介

 二十. 學習目標