【问题标题】:Why my child process exit without actual termination?为什么我的子进程在没有实际终止的情况下退出?
【发布时间】:2021-12-05 18:38:29
【问题描述】:

我正在写一个关于进程的程序

进程接受 bash 命令并使用 exec 运行它

我使用 fork() 在其中创建子进程 run exec

并计划在父进程中做一些后期处理

但由于某种原因,exec 运行正常,但 wait 无法正常工作

“在这里后处理”打印放在 exec 的程序终止之前

以前可以用,突然不行了,

我不知道我做了什么改变导致这个问题

#include <stdio.h>
#include <sys/wait.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
  /* code */

  for(int i = 0; i < argc; i++){
    //delete argv 0 for convincent
    argv[i] = argv[i + 1];
  }

  int pid = fork();
  if(pid == -1){
    return 1;
  }

  if(pid == 0){
    execvp(argv[0], argv);
  }else{
    wait(NULL);
    printf("post process here");
  }
  return 0;
}

【问题讨论】:

  • 当某些东西正常工作时,在您的版本控制系统中保存一个版本(您正在使用一个版本,不是吗?)。返回到以前的工作版本。找出你改变了什么。您还没有显示您为程序提供的命令行选项。您没有处理任何错误。您没有捕获wait() 返回的信息。您应该用换行符结束您的printf() 语句。无需像您一样使用argv 玩游戏。您可以改用execvp(argv[1], &amp;argv[1]);。当(如果)execvp() 返回时,您应该报告错误并以非零状态退出。

标签: c process operating-system


【解决方案1】:

第一:

//delete argv 0 for convincent
    argv[i] = argv[i + 1];

我会使用绑定 [argc+1] 的新数组,否则您将面临数组越界错误(缓冲区溢出)的危险。

第二: 调用的 bash 命令很重要。有些命令只是启动一个守护进程并自行完成。

【讨论】:

    猜你喜欢
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多