问题描述
有人可以澄清相关和无关过程的定义吗?
我知道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。