簡體   English   中英

在 fork 和 execvp 調用后循環不繼續

[英]While loop not continuing after fork and execvp calls

第一次運行我的程序后,它運行正常,但循環沒有繼續。

我嘗試在我的 function 中添加更多叉子,但它似乎不起作用。

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

 using namespace std; 

 int main(){
int pipefd[2];
int rs;
pid_t cpid;
char* args1[256];
char* args2[256];
char cmd1[256];
char cmd2[256];
char path1[10];
char path2[10];
//starts while loop 
while(true){
//creates pipe
rs = pipe(pipefd);
if (rs < 0){
    perror("pipe");
    exit(1);
}
//gets comands from user
cout << "Command 1";
cin.getline(cmd1,256);
cout << "command 2";
cin.getline(cmd2,256);
//checks id with commands are quit
if (strcmp(cmd1,"quit") == 0)
    break;
if (strcmp(cmd2,"quit") == 0)
    break;
char *token;
token = strtok(cmd1," ");
int i=0;
//splits char arrays up
while(token != NULL){
    args1[i] = token;
    token = strtok(NULL, " ");
    i++;
}
args1[i] = NULL;
token = strtok(cmd2," ");
i = 0;
while(token != NULL){
    args2[i] = token;
    token = strtok(NULL, " ");
    i++;
}
args2[i] = NULL;
strcpy(path1,args1[0]);//copis the command to the path file
strcpy(path2,args2[0]);
//forks and creates child process
rs = fork();
if (rs == 0){//child process
    close(pipefd[1]);//close write end of pipe
    close(0);//close standard input
    dup(pipefd[0]);//duplicate read end of pipe into standard 
  input
    close(pipefd[0]);//close read end of pipe
    rs = execvp(path2,args2);//runs program 2
    if (rs < 0){
        perror("execl");
        exit(1);
    }
}
else{//PARENT PROCESS
    close(pipefd[0]);//close read end of pipe
    close(1);//close standard input
    dup(pipefd[1]);//duplicate write end of pipe into standard 
   input
    close(pipefd[1]);//clsoe write end of pipe
    rs = execvp(path1,args1);//runs command 1
    if (rs < 0){
        perror("execl");
        exit(1);
    }
    }

}
return 0;
}

第一次完成循環后,應要求用戶再輸入兩個命令或能夠退出 function

rs = execvp(path1,args1);//運行命令1

“父進程”中的這一行替換了當前程序。 成功后不再有 while 循環,只有program 1

這樣想吧。 當用戶向您的程序輸入m對命令時,您希望生成多少個進程? 您預計總共有2m個進程,每個進程對應於一個命令,但您只分叉m次,每個進程對應於當前代碼中 while 循環的迭代。

相反,您應該為program 1分叉一個不同的進程,類似於您對program 2的處理方式。

暫無
暫無

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

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