如何正确使用fork()和exec()

时间:2011-12-03 21:58:24

标签: c process exec fork

我有这个代码;

pid_t process;
process = fork();

if (process < 0){
   //fork error
   perror("fork");
   exit(EXIT_FAILURE);
}
if (process == 0){
   //i try here the execl
   execl ("process.c", "process" , n, NULL);
}
else {
   wait(NULL);
}

我不知道fork()exec()的使用是否正确。当我尝试从bash运行程序时,我没有收到任何结果,所以我认为这部分代码可能存在问题。
感谢。

2 个答案:

答案 0 :(得分:15)

一个问题是

if (process = 0){

应该阅读

if (process == 0){

否则,您 0分配给process,如果execl非零(即从不),则仅调用result

此外,您正在尝试执行名为process.c的内容。毫无疑问,人们可以拥有一个名为process.c的可执行文件。但是,传统上以.c结尾的名称将被赋予C源代码文件。如果process.c确实是C文件,则需要先编译并链接它。

构建可执行文件后,您需要将其放在$PATH上的某个位置,或指定execle()的完整路径。在许多Unix环境中,将它放在当前目录中是不够的。

最后,不清楚n调用中execle()是什么,但名称提示数字变量。你需要确保它是一个字符串,而不是一个整数。

答案 1 :(得分:-1)

根据上面的答案和评论,您的代码应该看起来有点像

pid_t process;
process = vfork(); //if your sole aim lies in creating a child that will ultimately call exec family functions then its advisable to use vfork

if (process < 0)
{
  //fork error
  perror("fork");
  exit(EXIT_FAILURE);
}
if (process == 0)
{
  //i try here the execl
  char N[MAX_DIGITS];//A correction here
  itoa(n,N);//write this function yourself
  execl ("process", "process" , N, NULL);// Here process is the name of the executable N is your original argument
  fprintf(stderr,"execl failed\n");//check for error in execl

}
else
{
  wait(NULL);
}

注意使用vfork而不是fork.Its,因为它会更有效。可以找到原因here