2017-02-11 4 views
0

Моя цель - создать N дочерний процесс с одним отцом процесса.не может выполнить execl после fork

Я использую два 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(); if (i == 1) {// code} Это означает, что только один родительский процесс выполнит код между скобками –

+1

Кроме того, 'execl' является syscall и не расширяет' ~ 'до домашнего каталога (это делается оболочкой). Другими словами, '~' также должен быть явно интерполирован как: 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); 

}