2011-04-17 72 views
0

我正在寫一個小程序的類的c程序。用戶輸入一個命令,代碼使用exec()函數執行它。孩子沒有正確地終止叉

我需要在這個過程中有一個分叉,所以所有的工作都是在子進程中完成的。唯一的問題是孩子不會正確終止並執行命令。當我運行沒有fork的代碼時,它完美地執行命令。

該問題似乎來自於我創建要在execv調用中使用的字符串。這是我撥打strcpy的代碼行。如果我發表評論,事情工作正常。我也嘗試將其更改爲strncat,並帶有相同的問題。我無能爲力,並且歡迎任何幫助。

#include <sys/wait.h> 
#include <vector> 
#include <sstream> 
#include <cstdlib> 
#include <stdio.h> 
#include <iostream> 
#include <string.h> 
#include <unistd.h> 

using namespace std; 

string *tokenize(string line); 
void setCommand(string *ary); 

string command; 
static int argument_length; 

int main() { 
    string argument; 
    cout << "Please enter a unix command:\n"; 
    getline(cin, argument); 
    string *ary = tokenize(argument); 

    //begin fork process 
    pid_t pID = fork(); 
    if (pID == 0) { // child 
     setCommand(ary); 

     char *full_command[argument_length]; 
     for (int i = 0; i <= argument_length; i++) { 
      if (i == 0) { 
       full_command[i] = (char *) command.c_str(); 
       // cout<<"full_command " <<i << " = "<<full_command[i]<<endl; 
      } else if (i == argument_length) { 
       full_command[i] = (char *) 0; 
      } else { 
       full_command[i] = (char *) ary[i].c_str(); 
      // cout<<"full_command " <<i << " = "<<full_command[i]<<endl; 
      } 
     }  

     char* arg1; 
     const char *tmpStr=command.c_str();   
     strcpy(arg1, tmpStr); 
     execv((const char*) arg1, full_command); 
     cout<<"I'm the child"<<endl; 
    } else if (pID < 0) { //error 
     cout<<"Could not fork"<<endl; 
    } else { //Parent 
     int childExitStatus; 
     pid_t wpID = waitpid(pID, &childExitStatus, WCONTINUED); 
     cout<<"wPID = "<< wpID<<endl; 
     if(WIFEXITED(childExitStatus)) 
      cout<<"Completed "<<ary[0]<<endl; 
     else 
      cout<<"Could not terminate child properly."<<WEXITSTATUS(childExitStatus)<<endl; 
    } 

    // cout<<"Command = "<<command<<endl; 
    return 0; 
} 

string *tokenize(string line) //splits lines of text into seperate words 
{ 
    int counter = 0; 
    string tmp = ""; 
    istringstream first_ss(line, istringstream::in); 
    istringstream second_ss(line, istringstream::in); 

    while (first_ss >> tmp) { 
     counter++; 
    } 

    argument_length = counter; 
    string *ary = new string[counter]; 
    int i = 0; 
    while (second_ss >> tmp) { 
     ary[i] = tmp; 
     i++; 
    } 

    return ary; 
} 

void setCommand(string *ary) { 
    command = "/bin/" + ary[0]; 

// codeblock paste stops here 
+0

我清理了你的代碼,仍然無法理解你正在嘗試做什麼。我猜你也不太瞭解它。從你的老師那裏尋求幫助。 – msw 2011-04-17 04:38:56

回答

2

你說:

它的代碼行,我叫 的strcpy。

您尚未分配任何內存來存儲您的字符串。 strcpy的第一個參數是目標指針,並且您正在爲該指針使用未初始化的值。從strcpy手冊頁:

char * strcpy(char * s1,const char * s2);

stpcpy()和strcpy()函數將字符串s2複製到s1(包括終止'\ 0'字符的 )。

可能還有其他問題,但這是我第一次選擇。

+0

我真的很討厭自己,因爲這是一個多麼簡單的修復,但這似乎是一個確切的問題。我將arg1的定義更改爲char arg1 [command.length()],現在它完美運行。萬分感謝! – gdawgrancid 2011-04-17 04:47:44