我的目标是使用一个进程父亲创建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(要创建的子进程的数量),第二个参数是要执行的文件的名称。 我的问题是子进程不起作用。 请知道
答案 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);
}