#define STACK_SIZE (1024 * 1024)
static char container_stack[STACK_SIZE];
char* const container_args[] = {
"/bin/bash",
NULL
};
int pipefd[2];
...
int container_main(void* arg)
{
...
char ch;
close(pipefd[1]);
read(pipefd[0], &ch, 1);
printf("Get EOF [%d] from parent!\n", ch);
...
execv(container_args[0], container_args);
printf("Something's wrong!\n");
return 1;
}
int main()
{
...
pipe(pipefd);
printf("Parent [%5d] - start a container!\n", getpid());
int container_pid = clone(container_main, container_stack+STACK_SIZE,
CLONE_NEWUTS | CLONE_NEWPID | CLONE_NEWNS | CLONE_NEWUSER | SIGCHLD, NULL);
...
close(pipefd[1]);
...
return 0;
}
所以,在父进程中,我close(pipefd[1]);
,如果我从孩子的read(pipefd[0], &ch, 1);
读取,我将继续在子进程中工作。这是有道理的。
但是当我打印ch
的值时,它是0
,我认为它应该是-1
,这意味着EOF。
所以有人可以告诉我为什么我从孩子而不是EOF读取fd [0]中的0
?
答案 0 :(得分:1)
read()
在0
上返回EOF
...它会返回-1
以查找错误,因此如果管道的另一端已关闭,您希望read返回{ {1}}并且根本不修改ch。
这是我的错误,我希望将EOF打印到0
,但-1
已经处理read()
并返回EOF
。
感谢Dmitri& William Pursell