fork和execve的麻烦

时间:2012-10-05 19:13:19

标签: c linux process fork execv

因此,对于类赋值,我们正在创建自己的基本shell。在其他函数中,它必须能够使用fork()和execv处理绝对路径并执行外部应用程序。

这个想法是程序分叉子进程,调用execv替换所述子进程,并在外部执行完成时终止它。

不幸的是我错过了这个课程,我尝试了几个我在网上找到的例子,但没有一个有效。问题是父进程复制execv命令并终止自身。现在我只是想让它执行“/ bin / ls”并返回shell的主循环。

这是有问题的代码。我想我错过了一些简单的东西。是的,这对教授来说是一个很好的问题,但是他没有保持星期五的办公时间,而且我不想等待数小时或数天才能收到电子邮件回复。 :P同样我知道我应该实现更好的错误检查。现在我正在寻找基本功能,我稍后会添加铃声和口哨声。

我已经确认下面的所有变量都有正确的值。问题是如何在execv之后仅使子进程关闭并阻止父进程执行此操作?

TLDR:自学如何使用fork / execv并发现我绝对无能为力。

161 pid_t child = fork();
162 
163 if(child != -1) 
164   if(token[0] == '.' || token[0] == '/') 
165     if(access(token, X_OK) == 0) {
166       char** charArgs = toCharMatrix(args);
167       execv(token, charArgs);
169     } 

1 个答案:

答案 0 :(得分:1)

父级必须等待子进程完成...并且为了识别子级和父级,请使用fork返回的进程ID ..请参阅下面的示例:

int runcmd(char *cmd)
{
  char* argv[MAX_ARGS];
  pid_t child_pid;
  int child_status;

  parsecmd(cmd,argv);
  child_pid = fork();
  if(child_pid == 0) {
    /* This is done by the child process. */

    execv(argv[0], argv);

    /* If execv returns, it must have failed. */

    printf("Unknown command\n");
    exit(0);
  }
  else {
     /* This is run by the parent.  Wait for the child
        to terminate. */

     do {
       pid_t tpid = wait(&child_status);
       if(tpid != child_pid) process_terminated(tpid);
     } while(tpid != child_pid);

     return child_status;
  }
}