找回密码
 注册
查看: 1204|回复: 6

怎样在程序中实现把父进程的STDOUT定向到子进程STDIN

[复制链接]
发表于 2005-7-11 21:12:07 | 显示全部楼层 |阅读模式
如提~
发表于 2005-7-12 09:16:28 | 显示全部楼层
pipe ?
回复

使用道具 举报

发表于 2005-7-12 12:11:40 | 显示全部楼层
如此,如此:
[code:1]
#include <stdio.h>

int main()
{
        int status;
        char buffer[32];
       
        if (fork() != 0)
        {
                fscanf(stdout, "%s", buffer);               
        }
        else
        {
                system("ls");
        }

        return 0;
}
[/code:1]
回复

使用道具 举报

发表于 2005-7-12 12:50:12 | 显示全部楼层
close, dup
回复

使用道具 举报

发表于 2005-7-12 13:01:19 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2005-7-12 17:07:37 | 显示全部楼层
TO: 3 楼
看不懂你的代码~~~重定向了吗??不是要用DUP2的吗?
我其实想问的是因为一FORK,子进程就复制(COPY ON WRITE)了父进程所有的资源,也就是连STDOUT,STDIN都一样了,那就怎么区分是父进程的STDOUT呢,还是子进程的???他们两个不是一样的吗??
回复

使用道具 举报

发表于 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]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2025-2-8 05:57 , Processed in 0.022599 second(s), 16 queries .

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表