2017-01-22 102 views
1

好吧我做錯了什麼?我在Ubuntu上這樣做,我想讓系統命令「ls」和一個參數如「-a」,然後讓孩子執行它,然後父母只是打印出來。我不明白爲什麼我一直讓「父母」返回兩次。有任何想法嗎?使用fork進行C語言編程()

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

void Cprocess(char *commands, char *scommands[]); 
void Pprocess(void); 

void main(int argc, char *argv[]) 
{ 

    char *sendcommand[] = {argv[1],argv[2],0}; 
    char *commands = argv[0]; 
    int pid; 

    if((pid=fork()) ==-1) 
    { 
      perror("Error!!\n"); 
    } 
    else if(pid==0) 
      Cprocess(commands, sendcommand); 
    else 
    { 
      wait(0); 
      printf("Parent\n"); 
    } 
} 
void Cprocess(char *argv1, char *argv2[]) 
{ 
    execvp(argv1, argv2); 
    exit(19); 
} 

這是不是很好的我這裏是我輸入命令:

./filename ls -a 

這裏是我的結果:

filename1 filename2 filename3 
Parent 
Parent 
+0

你告訴你的孩子跑'command'這是'argv的[0]',它是當前程序。據推測,你的意思是複製'argv [1]'而不是'argv [0]'?或者,您可以不使用單獨的'command'命令,只需使用'sendcommand [0]'作爲'execvp()'的第一個參數。不過,我沒有跟蹤爲什麼你沒有得到運行父母的許多副本。 –

+0

BTW:main()應該返回int。 – wildplasser

回答

2

恭喜:您的程序非常作品。我認爲你已經使事情比他們需要插入Cprocess()函數更復雜一點;沒有它,發生了什麼可能會更清楚。請允許我重新安排你的程序了一下:

void main(int argc, char *argv[]) { 
    int pid = fork(); 

    if (pid ==-1) { 
     perror("Error!!\n"); 
    } else if (pid==0) { 
     char *sendcommand[] = { argv[1], argv[2], 0 }; 
     execvp(argv[0], sendcommand); 
     exit(19); 
    } else { 
     wait(0); 
     printf("Parent\n"); 
    } 
} 

這是功能上等同於原來的main(),我敢打賭,你會在裏面看到了問題的時候了。

提示:

仔細的參數execvp()查找。

提示2:

的第一個參數指定execvp()程序運行。

提示3:

你是認真的?讓你的大腦工作,或者至少是你的調試器。

+0

準確地添加了您的代碼並進行了更改:execvp(argv [0],sendcommand); execvp(argv [1],sendcommand);它的工作。我爲什麼得到兩個答覆? P.S.就像提示一樣! – shayster01

+1

程序在其參數中收到的'argv [0]'通常是程序本身的名稱。如果你將它作爲第一個參數傳遞給'execvp()',那麼你告訴它運行父程序的另一個副本。還要注意,作爲第二個參數傳遞給'execvp()'的數組需要遵循相同的約定 - 第一個元素(在索引0處)預計爲某種形式的程序名;實際參數從索引1開始。 –

+0

感謝您的快速回復和解釋。 – shayster01