[英]Understanding fork, exec, and wait in C++ (Linux)
我對在Linux中使用這些不同類型的系統調用非常陌生,這使我感到非常困惑。 這樣,我只是要求朝着正確的方向/開始,而不是要求完成。 使用fork
, exec
和wait
,我已經閱讀了它們,但是在我的情況下,這仍然沒有真正幫助我。 我要做的是以下幾點,
打印一個promt,然后等待用戶輸入最多包含四個參數或選項的命令。 “退出”將停止程序。
一些示例mkdir blah
創建目錄,然后提示輸入新命令,請touch blah/this blah/that blah/there
。
我要叫fork
創建一個子進程來執行輸入的命令,然后調用exec
在子進程使孩子成為被執行的程序(這部分讓我困惑甚至更多),最后調用wait
中父進程,以使解釋器在命令完成之前不會打印下一個提示。
做到這一點的最佳方法是什么? 如上,讀取命令/參數/選項然后執行它們的最佳方法是什么? 我會假設它會更好做,這是一個do..while
與while
條件是用於“退出”什么檢查
我知道我做了什么,沒什么。
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.