2017-02-11 65 views
0

我的目標是創建具有一個進程父的N進程子進程。無法在fork後執行execl

我用兩個files.The第一被命名爲forkn.c包含此代碼:

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


int main(int argc, char* argv[]) 
{ 
int status =4; 
int i=1; 
int wpid; 

for (int cpt=0;cpt<atoi(argv[1]);cpt++) 
{  
    if (i>0) 
    { 
    i=fork(); 
    if(i>0) 
    printf("I create process number %d \n",cpt+1); 
    } 
} 
//The father process created argv [1] son ​​process. This ensures a single father and argv [1] son ​​process 

    if(i==0) 
    {   
    execl("~/tpBash/tp2/argv[2]","argv[2]",(char*) NULL); 
    } 

    if (i>0) 
    { 
    for(int cpt=0;cpt<atoi(argv[1]);cpt++) 
    {  
    wait(&status) ; 

    } 
    printf("I am the father, I waited all my son processes, I finished \n"); 

    } 

} 

而且有trait2.c的代碼:

#include <sys/types.h> 
#include <wait.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
int main() 
{ 
    int status =4; 

    printf("I am the child process,my PID is : %d \n",getpid()); 
    exit(status); 

} 

我編後:

gcc -std=c99 forkn.c -o forkn 
gcc -std=c99 trait2.c -o trait2 

然後運行可執行文件:

./forkn 3 trait2 

第一個參數是N(要創建的子進程的數量),第二個參數是要執行的文件的名稱。 我的問題是,子進程不起作用。 任何想法請

+0

請請注意,「兒子進程」一詞並未真正使用。就我所知,流程是無性別的,因此在談到與父母的關係時簡單稱爲「子流程」。 –

+0

感謝您的建議。我英文不好 –

+0

您目前的代碼是叉形炸彈。您應該閱讀更多已經正常工作的示例代碼,並根據需要對其進行修改。 –

回答

4

你看到的是與你正在試圖做的字符串插值的方式問題:

execl("~/tpBash/tp2/argv[2]","argv[2]",(char*) NULL); 

我建議你嘗試snprintf

char buffer[ENOUGH]; 
snprintf(buffer, sizeof buffer, "%s/tpBash/.../...%s", home, argv[2]); 
execl(buffer, argv[2]...); 

此外, execl的第二個參數應該是argv[2]而不是"argv[2]"

+0

i = fork(); 如果(I == 1){//代碼} 這prouves,只有父進程將執行括號 –

+1

另外之間的代碼,'execl'是一個系統調用和不膨脹'〜'到主目錄(這是由shell完成的)。換句話說,也必須明確插入'〜':'snprintf(buffer,sizeof buffer,「%s/tpBash /.../...% s」,getenv(「HOME」),argv [2] )' – user4815162342

+0

@ user4815162342謝謝,我不知何故錯過了那裏有一個'〜'。 – cnicutar

0

#cnicutar的答案後,我更新我的使用snprintf的,但同樣的問題代碼仍然存在,子進程不執行

UPDATE

forkn.c:

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


    int main(int argc, char* argv[]) 
    { 
    int status =4; 
    int i=1; 
    int wpid; 

    for (int cpt=0;cpt<atoi(argv[1]);cpt++) 
    {  
     if (i>0) 
     { 
     i=fork(); 
     if(i>0) 
     printf("I create process number %d \n",cpt+1); 
     } 
    } 
    //The father process created argv [1] son ​​process. This ensures a single father and argv [1] son ​​process 

     if(i==0) 
     { 



    char buffer[255]; 
    snprintf(buffer, sizeof buffer, "~/tpBash/tp2", argv[2]); 
    execl(buffer, argv[2],(char*)NULL);   

     } 

     if (i>0) 
     { 
     for(int cpt=0;cpt<atoi(argv[1]);cpt++) 
     {  
     wait(&status) ; 

     } 
     printf("I am the father, I waited all my son processes, I finished \n"); 

     } 

    } 

trait2.c:

#include <sys/types.h> 
#include <wait.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
int main() 
{ 
    int status =4; 

    printf("I am the child process,my PID is : %d \n",getpid()); 
    exit(status); 

}