fork之后无法执行execl

时间:2017-02-11 10:04:52

标签: c linux fork

我的目标是使用一个进程父亲创建N进程子进程。

我正在使用两个文件。第一个名为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(要创建的子进程的数量),第二个参数是要执行的文件的名称。 我的问题是子进程不起作用。 请知道

2 个答案:

答案 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]"

答案 1 :(得分:0)

在#cnicutar的答案之后,我使用snprintf更新了我的代码但是同样的问题仍然存在,子进程没有执行

<强>更新

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);

}