|
发表于 2005-7-12 22:46:44
|
显示全部楼层
你所说的问题可以说是管道的标准用法。
所谓的"COPY ON WRITE"是指调用fork函数时,系统并没有真正立即执行数据段、堆栈段、堆的内容的拷贝,内核只是将这些内容设置成只读状态,当父进程或子进程试图修改某些内容时,核心才将被修改的部分在被修改之前进行拷贝。也就是说,当针对资源进行修改之前,核心会为子进程自动分配与父进程“相同”的资源,这个子进程的资源只不过是与父进程的资源又“相同”的内容,但却不是“同一个”资源。
标准输入标准输出是每个进程都拥有的资源。
读一下一下代码:
[code:1]
//将父进程读入的文件通过管道写入到子进程的标准输入。
// 创建了一个管道,并在子进程中调用execl执行了系统的排序程序sort
//
#include <stdio.h>
#include <unistd.h>
int main(int argc, char* argv[])
{
FILE* names; //输入文件
FILE* sort; //连接到sort的输出文件
int fd[2]; //管道的文件描述符
int ch;
if (argc != 2)
{
printf("使用方法: pipesort <输入文件名>\n");
exit(1);
}
names = fopen(argv[1], "r");
if (NULL == names)
{
perror("fopen");
exit(1);
}
if (fork() == 0)
{
//子进程代码
close(0); //关闭标准输入文件描述符
dup(fd[0]); //复制管道的输入端到标准输入
close(fd[0]); //关闭多余的管道描述符
close(fd[1]); //此处不使用管道的写入端口
execlp("sort", "sort", NULL);
perror("execlp");
exit(0);
}
//父进程的代码.
close(fd[0]); //不使用管道的读入端口.
if (sort = fdopen(fd[1], "w") == NULL)
{
//无法打开管道写入端
perror("fdopen");
exit(1);
}
//复制数据到sort程序
while ((ch = getc(names)) != EOF)
{
putc(ch, sort);
}
fclose(names);
fclose(sort);
return (0);
}
[/code:1] |
|