c - fork 和 execve 的问题

标签 c linux process fork execv

因此,对于类作业,我们正在制作自己的基本外壳。在其他功能中,它必须能够处理绝对路径并使用 fork() 和 execv 执行外部应用程序。

这个想法是程序 fork 一个子进程,调用 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     } 

最佳答案

父进程必须等待子进程完成...为了识别子进程和父进程,请使用 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;
  }
}

关于c - fork 和 execve 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12752647/

相关文章:

linux - 使用在双引号中包含空格的参数调用 std::system

linux - bash - 如何按字数将长字符串分成多个字符串

c - 是否可以在linux C程序中重新定义 "~/"(HOME目录)的值(无root权限)

linux - Linux进程的 "user"区域布局

c - 提高并发进程的效率 - 设置 CPU 限制或其他?

c - 通过指针访问结构中的指针

c - 将作业拆分为两个线程,使用 wait、waitpid、fork

c# - 限时杀进程的逻辑

c - 如何在C语言中正确使用malloc?

java - 将 C 语句转换为 Java (Array[][] != 0)