#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE *fp;
int fd, pid;
const char *str = "stdout has been closed\n";
/* vfork 虽然在执行exec或exit前,运行在父进程的地址空间,但仍然会对打开的文件描述符执行dup操作,
也就是说 同一地址空间的文件描述符在父子进程各有一份(文件描述符所关联数据的)副本 */
if ((pid = vfork()) < 0)
{
perror("vfork");
}
else if (pid == 0)
{
printf("child pid:%d\n", getpid());
fclose(stdout); // 就stdout流指针本身来说: 父子进程公用该地址空间的同一对象stdout,close后则无效
exit(0);
}
else
{
printf("parent pid:%d\n", getpid());
write(STDOUT_FILENO, str, strlen(str));
}
return 0;
}
运行结果:
child pid:3097
stdout has been closed