QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 810|回复: 8

关于管道???

[复制链接]
发表于 2005-7-1 16:05:24 | 显示全部楼层 |阅读模式
我想请教各位大侠
input=write(pipe[1],String,strlen(String));这个是把String写进管道是吧?
input=read(pipe[0],buffer,BUFSIZ);那这个是把String从管道里读出写进buffer是吗?
我想问的是,写进buffer之后,buffer里是不是一直有这个String呢?(感觉好想不是)
如果不是,我怎么把这个String一直保存在这个buffer里呢???
发表于 2005-7-1 16:32:32 | 显示全部楼层
管道读完了就没了。

如果是想让两个进程共有某个值,用共享内存。

man shmget
回复

使用道具 举报

 楼主| 发表于 2005-7-1 16:59:54 | 显示全部楼层
[quote:585aa3957e="kakuyou"]管道读完了就没了。

如果是想让两个进程共有某个值,用共享内存。

man shmget[/quote]

共享内存具体怎么做呢?能给我个简单的例子吗?谢谢,拜托了,我已经郁闷很久了!
还有,那如果我一直没有read pipe呢,管道里的DD在哪里?怎么能判断出来???
回复

使用道具 举报

发表于 2005-7-1 17:56:41 | 显示全部楼层
[code:1]
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>


int main(int argc, char** argv)
{
        int mid;
        void* maddr = NULL;

        mid = shmget(0x00001000, 512, IPC_CREAT|0666);
        if(mid == -1)
                exit(-1);

        maddr = shmat(mid, NULL, 0);
        if((int)maddr == -1)
                exit(-2);

        if(argc > 1)
        strcpy(maddr, argv[1]);
        else
        fprintf(stdout, "%s\n", maddr);



        return 0;
}
[/code:1]

这个程序运行时如果带参数,就写入共享内存,如果没有,就读出。
注意,我的程序里面没有释放共享内存。
回复

使用道具 举报

 楼主| 发表于 2005-7-1 18:09:36 | 显示全部楼层
多谢kakuyou 我写了注释,看看我的理解是不是正确!*^_^*
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>


int main(int argc, char** argv)
{
        int mid;
        void* maddr = NULL;

        mid = shmget(0x00001000, 512, IPC_CREAT|0666); //生成一块内存
        if(mid == -1)
                exit(-1);

        maddr = shmat(mid, NULL, 0);
                     //让指针maddr只向这个块内存 NULL, 0 什么意思不知道
        if((int)maddr == -1)
                exit(-2);

        if(argc > 1)
        strcpy(maddr, argv[1]); //将参数写入共享内存,如果我直接写一个变量进去可以不?
        else
        fprintf(stdout, "%s\n", maddr);



        return 0;
}

高手,请多指教!!!*^_^*
回复

使用道具 举报

 楼主| 发表于 2005-7-1 18:11:18 | 显示全部楼层
忘记问了,如果我的另一个进程想判断这个内存是不是被写入DD了,该怎么做呢?
回复

使用道具 举报

发表于 2005-7-1 18:52:59 | 显示全部楼层
shmget:第一个参数是个key值,自定
shmat:`第二个参数是指定映射的地址,设NULL是告诉操作系统随便那个都行
最后那个是flag,具体怎么用忘了

shmat返回的是一块内存,和用malloc获得的内存一样,随便指定类型,后果自负。

至于通知值改变,没什么通用的简单办法,具体视你的需求,常见的有
信号,管道,domain socket,临界量,或者子进程定期检查是不是与
以前拿到的值相同。

这些全是unix的基本编程需要的知识,找本书看看吧。

最后,我不是高手,是版主。
回复

使用道具 举报

发表于 2005-7-1 19:11:41 | 显示全部楼层

Re: 关于管道???

[quote:5be99790aa="zt_apple"]我想请教各位大侠
input=write(pipe[1],String,strlen(String));这个是把String写进管道是吧?
input=read(pipe[0],buffer,BUFSIZ);那这个是把String从管道里读出写进buffer是吗?
我想问的是,写进buffer之后,buffer里是不是一直有这个String呢?(感觉好想不是)
如果不是,我怎么把这个String一直保存在这个buffer里呢???[/quote]

抱歉,我给忘了

判断一下read的返回值是否和读出的东西的size是一样的,比它小就说明没有新的。
回复

使用道具 举报

 楼主| 发表于 2005-7-1 20:15:48 | 显示全部楼层
我试了一下,现在的问题是,我在主界面(父进程)程序里申请了共享内存,可是,在子进程里却看不到内存的地址,地址是0,天呀???(2个进程不在一个文件里,不知道是不是和这个有关)
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-5 19:35 , Processed in 0.048849 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

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