什么是相关过程和不相关过程?

问题描述

有人可以澄清相关和无关过程的定义吗?

我知道fork创建了两个相关的进程

fork()

但是,当我们调用exec *系列函数来替换程序映像时,我不确定该进程是否仍与之相关:

if (child) {
   exec("path to binary",...) <- Is it still related process
}

我要问的原因是要弄清楚在哪种情况下可以使用哪种IPC方法。例如,pipes仅在相关进程之间被允许。因此,我在上面要求澄清我编写的新程序(可能使用不同的语言)是否可以访问管道文件描述符。

我们能说用fork()创建的任何进程,无论使用的是exec还是原始程序映像都是始终相关的,而其他所有进程都不相关?

谢谢!

ref:马克·米切尔:高级linux编程

对管道的调用将创建文件描述符,该文件描述符仅在该进程及其进程中有效 孩子们。进程的文件描述符不能传递给不相关的进程;然而, 当进程调用fork时,文件描述符将被复制到新的子进程中。 管道只能连接相关进程。

解决方法

我们能否说用fork()创建的任何进程,无论是否 exec或使用的原始程序映像始终相关吗?

是的,我们可以。

无论您是否在子进程中调用exec,父进程和子进程仍可以使用管道相互通信。请参见下面的创建子进程的示例,该子进程将自身更改为 echo ,然后父级仍可以读取其 echo 参数。

#include <iostream>
#include <unistd.h>
#include <sys/wait.h>
#include <errno.h>
#include <assert.h>

int main() {

  int filedes[2];
  int const pipeRes = ::pipe(filedes);
  assert(pipeRes != -1) ;

  pid_t pid = ::fork();
  assert(pid != -1);

  if (pid == 0) // child code                                                                                                                                                                                                               
    {
      // connect the entrance of the pipe to STDOUT_FILENO within the child process                                                                                                                                                         
      while ((::dup2(filedes[1],STDOUT_FILENO) == -1) && (errno == EINTR)) {}
      // close both input and output of new pipe in child process                                                                                                                                                                           
      close(filedes[1]);
      close(filedes[0]);
      execl("/bin/echo","echo","child-says-hello",(char*)0);
      assert(false); // execl failed                                                                                                                                                                                                        
    }

  // parent code                                                                                                                                                                                                                            
  close(filedes[1]); // close input of new pipe in parent,it will only read from it                                                                                                                                                        

  char buffer[1024];
  while (1)
    {
      ssize_t count = read(filedes[0],buffer,sizeof(buffer));
      if (count == -1)
        {
          if (errno == EINTR) continue;
          else assert(false);
        }
      else if (count == 0)
        {
      // read everything                                                                                                                                                                                                                
          break;
        }
      else
        {
          std::cout << "received count:" << count << " bytes with: " << buffer << "\n";
        }
    }

  close(filedes[0]);
  wait(0);
  return 0;
}

输出为

eceived count:17 bytes with: child-says-hello

上面的代码示例基于this tutorial

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...