初窺多進程

程序的實例被稱爲進程,有三個用於進程控制的主要函數:fork、exec和waitpid。

接下來會有一段類shell程序的簡化實現代碼,讓我們一起來看看以上3個函數是如何使用的,隨後參照代碼,會有比較詳細的要點解釋。



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

#define MAXLINE 4096

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

    char buf[MAXLINE] = "";
    int len = 0;
    int status = 0;

    printf("%% ");
    while (fgets(buf, MAXLINE, stdin))
    {
        len = strlen(buf);
        if (buf[len - 1] == '\n')
        {
            buf[len - 1] = '\0';
        }

        if ((pid = fork()) < 0)
        {
            printf("fork error\n");
            exit(1);
        }
        else if (pid == 0) //child
        {
            execlp(buf, buf, (char*)0);
            printf("couldn't execute: %s\n", buf);
            exit(127);
        }
        
        //parent
        if ((pid = waitpid(pid, &status, 0)) < 0)
        {
            printf("waitpid error\n");
        }
        printf("%% ");
    }


}

1、用標準I/O函數fgets從標準輸入一次讀一行,當鍵入文件結束字符(ctrl+D)作爲一行的第一個字符時,fgets返回一個null指針,於是循環退出,進程也就終止。

2、fgets返回的每一行都以換行符終止,後隨一個null字符,故用標準C函數strlen計算此字符串長度,並用一個null字節代替換行符。這樣做是因爲execlp函數要求參數以null而不是換行符結束。

3、調用fork創建一個新的進程,它是調用進程的一個拷貝。我們稱調用進程爲父進程,新創建的進程爲子進程。fork給父進程返回一個非負整數,給子進程返回0。fork被調用一次(被父進程調用),但是返回兩次(分別在父進程和子進程中返回)。

4、waitpid可以顯示指定需要等待哪個子進程結束。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章