簡體   English   中英

了解C ++中的fork,exec和wait(Linux)

[英]Understanding fork, exec, and wait in C++ (Linux)

我對在Linux中使用這些不同類型的系統調用非常陌生,這使我感到非常困惑。 這樣,我只是要求朝着正確的方向/開始,而不是要求完成。 使用forkexecwait ,我已經閱讀了它們,但是在我的情況下,這仍然沒有真正幫助我。 我要做的是以下幾點,

打印一個promt,然后等待用戶輸入最多包含四個參數或選項的命令。 “退出”將停止程序。

一些示例mkdir blah創建目錄,然后提示輸入新命令,請touch blah/this blah/that blah/there

我要叫fork創建一個子進程來執行輸入的命令,然后調用exec在子進程使孩子成為被執行的程序(這部分讓我困惑甚至更多),最后調用wait中父進程,以使解釋器在命令完成之前不會打印下一個提示。

做到這一點的最佳方法是什么? 如上,讀取命令/參數/選項然后執行它們的最佳方法是什么? 我會假設它會更好做,這是一個do..whilewhile條件是用於“退出”什么檢查

我知道我做了什么,沒什么。

int main()
{
char command[25];
pid_t  pid;
int rs;
cout << "Enter command: ";
cin >> command;

while(strcmp(command, "exit") != 0) {
    pid = fork();

    if (pid == 0) { //child process
    rs = execl("echo", command);
            }
 else { // parent process
    cout << "Enter a command: ";
    cin >> command; 
}

}



return 0;
}

這些系統調用各自的功能的一般細分:

fork分叉當前進程。 從字面上看,當調用fork時,執行將在調用fork時暫停,並將整個程序復制到一個新的進程空間中,該空間是原始進程的子級。 然后,兩個進程在fork並行調用之后立即繼續執行。 您需要獲取PID才能判斷當前正在執行的程序是子進程還是父進程。

exec :暫停當前進程的執行,使用指定的要運行的新程序擦除內存中的當前進程。 然后,它將運行新程序。

wait :暫停當前進程,直到至少一個子進程終止。 它是waitpid()的包裝,它使您可以暫停當前進程的執行,並等待當前進程的子進程的狀態更改(它可以是其自身的克隆,也可以是exec交換的新程序)。

這是我在大學上的一堂課的一些演示代碼,演示了等待和分叉(但沒有執行):

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <semaphore.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/wait.h>
const int BUFFER_SIZE = 1000;

void copySegment(int i, int segmentSize, FILE * fin, FILE * fout) {
    // Does not need to be shown to prove point
}

int main(int argc, char * argv[]) {
    int i;
    sem_t * sem;
    pid_t pid;
    FILE * fin, * fout;
    struct stat sbuf;
    int fileSize, fileDescriptor, segmentSize;
    fin = fopen(argv[1], "r");
    fout = fopen("forkcopy.txt", "w");
    fileDescriptor = fileno(fin);
    fstat(fileDescriptor, &sbuf);
    fileSize = sbuf.st_size;
    segmentSize = fileSize / 4;
    sem = sem_open("sem", O_CREAT | O_EXCL, 0644, 4);
    sem_unlink("sem");
    for (i = 0; i < 4; i++) {
        pid = fork();
        if (pid < 0)
            printf("Fork error.\n");
        else if (pid == 0)
            break;
    }
    if (pid != 0) {
        while (pid = waitpid(-1, NULL, 0)) {
            if (errno == ECHILD)
                break;
        }
        sem_destroy(sem);
        fclose(fin);
        fclose(fout);
        exit(0);
    } else {
        sem_wait(sem);
        copySegment(i, segmentSize, fin, fout);
        sem_post(sem);
        exit(0);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM