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

4
我有这段代码;
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个回答

17

一个问题是

if (process = 0){

应该这样读

if (process == 0){
否则你是将零赋给了`process`,并且只有在`result`非零(即从未)时才调用`execl`。
另外,你试图执行名为`process.c`的东西。毫无疑问,可以有一个名为`process.c`的可执行文件。但是,通常以`.c`结尾的名称被赋予C源代码文件。如果`process.c`确实是一个C文件,则需要先编译和链接它。
一旦你构建了可执行文件,你需要将其放置在`$PATH`某个地方或者指定其完整路径给`execle()`。在许多Unix环境中,将其放置在当前目录可能不够。
最后,不清楚在`execle()`调用中`n`是什么,但名称暗示着一个数字变量。你需要确保它是一个字符串而不是例如整数。

我创建了一个Makefile,其中编译了所有我的函数,我有一个名为“process”的可执行文件。但我不知道这是否足够。在ececl中是否可以传递数字参数而无需强制转换? - Sicioldr
@Sorcipuppolo:强制类型转换对你没有任何好处,因为它不会为字符串分配内存...你必须将所有内容转换为字符串。 - NPE
execl("/path/process", "/path/process", "5", NULL); 执行("/路径/进程", "/路径/进程", "5", NULL); - Duck
@aix:但是如果我需要传递一个数字参数怎么办?(无论如何,非常感谢您的帮助) - Sicioldr
只需使用sprintf()将数字转换为字符串,并使用指向该字符串的指针。您正在为exec-ed程序设置命令行。所有程序参数都是字符串。 - Duck
显示剩余2条评论

-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。这是因为它会更有效率。原因可以在这里找到。

如果在vfork()之后子进程写入n,则进程会遇到未定义的行为。如果在exec*()之前修改任何变量,请使用fork() - alk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接