标题: 急!求教关于共有内存的问题
kevin-young
新生入学
Rank: 1
注册用户



UID 195998
精华 0
积分 0(积分有什么用?)
帖子 6
阅读权限 10
注册 2007-5-12
状态 离线
发表于 2007-5-12 10:07  资料  个人空间  短消息  加为好友 
急!求教关于共有内存的问题

我是一个linux的初学者,看到一个题目,是关于一个主程序开辟了一块共有内存,设置了一个属性为index=1。现在主程序生成了两个子进程,子进程1访问共有内存,当index=1时,就把index从1一直改到5,而子进程2访问共有内存,当index=5时,就把index从5改到10,主程序看到index=11时就退出,销毁共有内存。请教各位大虾,这个改如何实现啊?感激ing~~~~~^SY4n_e4tI1\B
还有一个要求是2个子进程要生成可执行程序后,才用主进程启动然后主进程与子进程之间,对共有内存进行互动操作

顶部
不容错过的IBM 集群技术资源汇总
kevin-young
新生入学
Rank: 1
注册用户



UID 195998
精华 0
积分 0(积分有什么用?)
帖子 6
阅读权限 10
注册 2007-5-12
状态 离线
发表于 2007-5-12 10:15  资料  个人空间  短消息  加为好友 
#define MAIL_SHM_KEY_MAILSEND (key_t)0x8000        typedef struct Shared_Memory{        int        index;}SHARED_MEMORY;int main( int argc, char *argv[] )Linux伊甸园论坛X:S(c-_Xy)_#[1]
{
o#t/V2J1~G.SN2h    SHARED_MEMORY    *mSharedMemory    = NULL;
2q F5GkeW i8h    struct    shmid_ds    *shm_ds        = NULL;www.linuxeden.com)Z1p1Ric Eko+Q*MY
    int    mShmId            = 0;   
:i%d9m d(W$PX;L Q        o        RdUwww.linuxeden.com
1N!jApdk
u.ZG
    mShmId = shmget(MAIL_SHM_KEY_MAILSEND,sizeof( MAIL_SEND_SET_ST ), 0777 | IPC_CREAT );
:?Y+F        y^Hp    if ( mShmId == -1 )
n!J6Z9~'j@5]5v
}~{
    mShmId = shmget( MAIL_SHM_KEY_MAILSEND, 0, 0777 );Linux伊甸园论坛E9z`g%|2D
        if( mShmId == -1 ){www.linuxeden.comi%RP$^NG9b8V0m7r
            return 1;lfs:uN({
Cy

        }www.linuxeden.comQ3nr        e:wh0ju
        aSubRet = shmctl( mShmId, IPC_RMID, shm_ds );
BuU;^r.U0KmLinux伊甸园论坛        if( aSubRet == -1 ){
K*J$K:gy$U:Ht:xn:W,Y$^Linux伊甸园论坛            return 1;
[$\{;XG[Linux伊甸园论坛        }3WC#\hUsz y1s{
        mShmId = shmget( (key_t)MAIL_SHM_KEY_MAILSEND, sizeof(MAIL_SEND_SET_ST), 0777 | IPC_CREAT);
:g(f|#xk'w*Ry'zP        if( mShmId == -1 ){
"u L5^ES^            return 1;P;R
p2AS.vY

        }aA$@ AkM5W5C_)Q
    }.B\7VV$mA{]

S\VmV    mSharedMemory = (MAIL_SEND_SET_ST*)shmat(mShmId, (void *)0, 0);
/~kN$b1E9eGQ LLinux伊甸园论坛    if( (ADDR)mSharedMemory <= 0 )
b1n8BO(PYs,i U    {AXt        WEc;B*XT
        return 1;
^c5@OoD"Ty^S    }
uO'|7R Of,x
|www.linuxeden.com
7U{i2tXS|1j-F
    memset( mSharedMemory, 0, sizeof(MAIL_SEND_SET_ST) );:BIt8~:f9rB2T.{
sb/Pon{
    mSharedMemory->index = 1;b%`-\!P
D;W3^-T


w7r
fH?j0F)|9G
    execv("subProc1", );
9b A6J+m9m;xLinux伊甸园论坛    printf("SubProc1 Start\n");4K!V,r5x RIf
A"l
B

    execv("subProc2", );P
Q(T)v,[L ev7f&}R

    printf("SubProc2 Start\n");
IP0jyvM    printf("End Main Proc\n");
4N        tzH_www.linuxeden.com    while( 1 ) +kk-a*|P-ruM
    {RRZ0~$z
YA

    } P1cqq.{1{

[
Y
`~&B)g.o

}@*?mU n5x%S*FLT
这段代码改如何完善啊?

顶部
不容错过的IBM 集群技术资源汇总
kevin-young
新生入学
Rank: 1
注册用户



UID 195998
精华 0
积分 0(积分有什么用?)
帖子 6
阅读权限 10
注册 2007-5-12
状态 离线
发表于 2007-5-12 10:20  资料  个人空间  短消息  加为好友 
#define MAIL_SHM_KEY_MAILSEND (key_t)0x8000       
/w9b+p-Ye](eF
4H
R@#v)Swww.linuxeden.com
typedef struct Shared_Memory{
'd ux2Z        m.sU        int        index;6C!S;CS_/Z:H`g
}SHARED_MEMORY;-_5y)ib)SBn

]'n;F@et0J"h,Bint main( int argc, char *argv[] )
:ObL&@ y5~&P{Linux伊甸园论坛,I A
QZT2R^)x\

        SHARED_MEMORY        *mSharedMemory        = NULL;
n#M-M2o![ eAd6A&l        struct        shmid_ds        *shm_ds                = NULL;
D`%DFU)g        int        mShmId                        = 0;        ]md*C&W$T#y\

]%`(C-vTevwww.linuxeden.com        mShmId = shmget(MAIL_SHM_KEY_MAILSEND,sizeof( MAIL_SEND_SET_ST ), 0777 | IPC_CREAT );
nW)~x:W;UKO R9SLinux伊甸园论坛        if ( mShmId == -1 )J?i(n`DXs
                mShmId = shmget( MAIL_SHM_KEY_MAILSEND, 0, 0777 );Linux伊甸园论坛y5R
}/ga)rc

                if( mShmId == -1 ){Xn?p3NS"XC$s
                        return 1;
8X
r@4jVj {z9Cwww.linuxeden.com
                }
7p \w$H'zx
l9x+S"QLinux伊甸园论坛
                aSubRet = shmctl( mShmId, IPC_RMID, shm_ds );o5Z ]*^
} B n

                if( aSubRet == -1 ){p.c{o8Ws3E*C1R!f
                        return 1;
*YCl'r
X
U
                }
*x\j[V~                mShmId = shmget( (key_t)MAIL_SHM_KEY_MAILSEND, www.linuxeden.com(ai-K{3f @ Cn
                                         sizeof(MAIL_SEND_SET_ST),
D4ri&ns)`'kK#TLinux伊甸园论坛                                         0777 | IPC_CREAT);
-Zr5Q"u#U,W tV                if( mShmId == -1 ){www.linuxeden.comN{u(ys,Yp%p-?\
                        return 1;Linux伊甸园论坛cD4g9m1n
                }o[r3L"Z;^+`
        }P7I\ U.T
        Zf0x*Vb2b5l}
        mSharedMemory = (MAIL_SEND_SET_ST*)shmat(mShmId, (void *)0, 0);
&H6v p|O9a
h
        if( (ADDR)mSharedMemory <= 0 )EKn1Y4j
O&s"\

        {
.i*K%cI |~aj                return 1; {&c*r.J;r
        }Linux伊甸园论坛@uP&HX
YB

        Y6p@@8b(A;Q
        memset( mSharedMemory, 0, sizeof(MAIL_SEND_SET_ST) );www.linuxeden.com j)[7Q'n0?'J
1~}1A0T/U
        mSharedMemory->index = 1;
}.Vy2Az/Q
'h;w VHN`w
S

f'`/r0J8Ibq Mw        execv("subProc1", );
#N0?/o TP
GWwww.linuxeden.com
        printf("SubProc1 Start\n");www.linuxeden.com6h+c F@L s xY
i]M3~d
        execv("subProc2", );
9i1i-j1? k/w
l
        printf("SubProc2 Start\n");Q+}!I#nK3]

#O!s-bt
E[9@3s
        printf("End Main Proc\n");DFxJ F0{n
        while( 1 ) %J+]9m!m&ER{
        {
*zokj%cM        }Linux伊甸园论坛)^J/~+Zj~rz
       
f'A)o2RtL}
"gJKrh这段代码改如何完善啊?

顶部
kevin-young
新生入学
Rank: 1
注册用户



UID 195998
精华 0
积分 0(积分有什么用?)
帖子 6
阅读权限 10
注册 2007-5-12
状态 离线
发表于 2007-5-12 14:45  资料  个人空间  短消息  加为好友 
这个论坛没人的啊?

顶部
不容错过的IBM 集群技术资源汇总
flag
版主
Rank: 7Rank: 7Rank: 7
版主



UID 19801
精华 1
积分 28(积分有什么用?)
帖子 5581
阅读权限 100
注册 2002-7-19
状态 在线
发表于 2007-5-12 17:38  资料  个人空间  短消息  加为好友 
先告诉我,那段代码你看明白没有?





上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。
顶部
kevin-young
新生入学
Rank: 1
注册用户



UID 195998
精华 0
积分 0(积分有什么用?)
帖子 6
阅读权限 10
注册 2007-5-12
状态 离线
发表于 2007-5-14 12:24  资料  个人空间  短消息  加为好友 
这段代码我已经看明白了,我根据这段代码自己写了如下的三段代码,不过结果不对!+?-?(I.g,S]
proc.h
w
o Hufq.n4E
O
#include <stdio.h>2J:U$UB%K!k9r"C
#include <sys/shm.h>Linux伊甸园论坛NEP8B#R
#include <sys/ipc.h>
k8W CxrkU
d
#include <sys/types.h>,v[VD
f8\Z/@h+eI-x8{

#include <unistd.h>
+?`x){@{$}RN DS)k#include <string.h>
Y
g@Gb'N-c
#include <errno.h>r[9k}P        C;[E'b
#define shm_key (key_t)0x8000www.linuxeden.comCg:t Lp
Linux伊甸园论坛u.JeIA._M
typedef struct share_memory{
.?0Gq.s6i+L        int index;T-I c&t4H"Wq#NUD*a ^&]
}SHARE_MEMORY;
0P'Yy0Z$~
JW
-QJ/Di{
subproc1.c
P8Arxzb1sd_#include "proc.h"
"PT4M%A(lLinux伊甸园论坛#include <stdio.h>
        |"hs6M tf x~#include <sys/shm.h>
C'}JE+wI uk#include <sys/ipc.h>www.linuxeden.comuME}b@'R|
#include <sys/types.h>
:RZ;F\{Pg`3e#include <unistd.h>
E"~WG6T'`        VLN-v6pLinux伊甸园论坛#include <string.h>
0}$xY        Q9Z'W#include <errno.h>.~ v/L
dH

www.linuxeden.com8o0mnYH d[*m5F-\i
int main(int argc,char *argv[])Linux伊甸园论坛]u|6u^?i7T M,c
{
]sm
|wH/N!hwww.linuxeden.com
        int shmid = 0;       
B1q]"[p8N        SHARE_MEMORY *mshare_memory;www.linuxeden.comD2L/MS?&b-y:p
$gG+E&A]MK
        shmid = shmget(shm_key,0,0777);www.linuxeden.comgt7VmP9b%^M?
        if(shmid == -1)
H ~$p1]Gn{        {
w{TTY|m&F!L                printf("subproc1  error %d\n",errno);
m/N,^'d
C5_9p/}+}
        }
3U%ij+[4|GA
|+_la.h'X)A {y

        mshare_memory = (SHARE_MEMORY*)shmat(shmid,0,0);www.linuxeden.com.O'm%x^0]]4s#Q0mT
7k3T8g2IP
        printf("subproc1 start...\n");
g+B,{&oW6n+WoL

        while(mshare_memory->index <6)Linux伊甸园论坛8cH+`!d)_;u~*s
        {               
$Dw y*L!Pai(Mn&S                printf("index= %d\n ",mshare_memory->index );|/a5^W1D&~a$U+u
                mshare_memory->index++;
snP
pX9tx+C/{
        }www.linuxeden.com"f;dB9T%CA2vb

yd;k;N5fY'm$A3z/w`4[ LCwww.linuxeden.com
!Y\*u(U/y        return 1;
        ^R3HY)PBN4YYu}9huj*]1c? y
S!l^#U-c0@ _Y
subproc2.cL3[kKUvW(JDU
#include "proc.h"
Mt%g        G]q
`
#include <stdio.h>www.linuxeden.com!r%V3T7?&d
#include <sys/shm.h>Zr#D"rq*UT%T
#include <sys/ipc.h>

J:K_o[#_0?
#include <sys/types.h>r l:F#H}0|+Pr
#include <unistd.h>DE"cvB8e
#include <string.h>www.linuxeden.comdk*e;G:e
#include <errno.h>
u        Qi)YXLinux伊甸园论坛
z;z8lL9M2|$C/Qint main(int argc,char *argv[])
``U.l4}'h D@sj{
{wJJ        Vy1v p        int shmid = 0;        7Ug        GMd4M
        SHARE_MEMORY *mshare_memory;
yr shmLinux伊甸园论坛 w;UE:V'U"}q+g7|*b`
        shmid = shmget(shm_key,0,0777);
&],Y] dsK^%U M        if(shmid == -1)
Dx}*pi.Q'X#`y
K
        {5H
^?4oY

                printf("subproc2 error %d\n",errno);.]*|9jt4u:yfd:RfRxl
        }
yWi#MB#y6fwww.linuxeden.comF }H$LlI'V9K/~;X
        mshare_memory = (SHARE_MEMORY*)shmat(shmid,0,0);Linux伊甸园论坛2q;|KHFC%z4D#K,y)y
+W/q oOenV
        printf("subproc2 start...\n"); iB_        Xh~.r*V.K
        while(mshare_memory->index >5 && mshare_memory->index<11) Ud!nzVv0FN)A
X]|

        {               
u3@2gj/K
GLinux伊甸园论坛
                printf("index= %d\n ",mshare_memory->index );-l^*TSp&M
                mshare_memory->index++;
+m,Rv;KMg        }*W(U8fd \w9}2X
        return 1;
X`^&l8h1lZLn@}
$Q$C-|}VM(sv
A6e

tN(}1n-_q#Fproc.c/O|.bf1A
#include "proc.h"YU,m:Cu6y E
#include <stdio.h>
'G,ANH$m3B3Ra#include <sys/shm.h>
%K%K        W(M/QPwww.linuxeden.com#include <sys/ipc.h>
l&GB2NP[.a#include <sys/types.h>
y'c\#f,e
q"wLinux伊甸园论坛
#include <unistd.h>
uI\N-q }.gN;rZ#include <string.h>
#zPf/{;z#QX0sLinux伊甸园论坛#include <errno.h>;zk%N4|!t1RE

/x(CX6sV#A Bwww.linuxeden.comint main(int argc,char *argv[])-n(~/j-\*GJ!f`
|&x

{g1O;H.{YH qq;r5F
        int shmid = 0;x6v
D6p5K8x0ZS'Xi5f|

        int shmret;
$V"?(lsWi$@:s3t        SHARE_MEMORY *msharememory = NULL;
o^3XDR`
T]t

G b&@ l i2`Linux伊甸园论坛        struct shmid_ds         *shm_ds        = NULL;www.linuxeden.comX!Y6h`8{
        shmid = shmget(shm_key,sizeof(SHARE_MEMORY ), 0777 | IPC_CREAT );
,?\6r4Y+]'lyG        if ( shmid == -1 )
OWkX!i        {Linux伊甸园论坛3p
U6LJIl#?(x/_%}4LX

                shmid = shmget( shm_key, sizeof(SHARE_MEMORY ), 0777 );\]u
VN@,Vw @d

                if( shmid== -1 ){Linux伊甸园论坛^a!h)f/iT,_P
                        return 1;R#c$J.gc        h6Y"y
                }
R2RO;hy*HE;wLC N;D
OF

                shmret = shmctl( shm_key, IPC_RMID, shm_ds );{K,_D(}*r-M
                if( shmret == -1 ){
D#]d'P kLinux伊甸园论坛                        return 1;
.~nfR]#pbwww.linuxeden.com                }
8IIM%D s:m3f
;It aV/qW,A"I                shmid = shmget( shm_key,sizeof(SHARE_MEMORY ),0777 | IPC_CREAT);2hvp"vhO t2o&Q
                if( shmid == -1 ){-pGwj \1B-k$B__Hd%B        {
                        return 1;
V-|*[VCCa3h7q                }
ij5v[$Hw        }
}pa
\I:U7WNuLinux伊甸园论坛

s(m        mq7X8k+W7_        msharememory = (SHARE_MEMORY*)shmat(shmid, (void *)0, 0);Linux伊甸园论坛tkc3X*f
        /*if( (ADDR) msharememory <= 0 )
L!n`R+]D3o        {
:R)`|
}D8K2f:s
                return 1;Linux伊甸园论坛&ea9`f.w2@ O
        }*/Linux伊甸园论坛8q(\a.\;y7aoS&J
1Y#n5]fYcP6o
        memset( msharememory,0,sizeof(SHARE_MEMORY));
2ci#udV|+]DP(Pwww.linuxeden.com        msharememory->index = 1;www.linuxeden.com\,b!iD`
        printf("main proc start...\n"); bd`3c%j'T#EAK
        printf("index = %d",msharememory->index);
q.| aAw x+x
0?;Z9f/Q8Ce        if(execv("/root/kevin/subproc1",argv ) == -1)www.linuxeden.com6T(g1Gk C PE5f
        {Linux伊甸园论坛 e Yok]&J'V/zv
                printf("error subproc1 &d\n",errno);
T.OGC6Ms9e OC,v        }F"I5{'l3N-[9m
KHl
{;_Vf,`w

        if(execv("/root/kevin/subproc2",argv ) == -1) MeH&xa'm
        {
qA!f-K*|.z7pK7}5N"A                printf("error subproc2 &d\n",errno);
.L%z
i)c.R        [qIwww.linuxeden.com
        }Linux伊甸园论坛Lm(@_l        kq
                while(1)
(r EK&OoG_ `        {
fFE
N3E/v6M@

        }-m U9BJy(XL

2TU7id$aH+W        if(msharememory->index == 11) F&r        _        x
l

        {h9D*d^)QA*h`$^U
                shmret = shmctl( shm_key, IPC_RMID, shm_ds );
Rh9GDL#T%h                if(shmret = -1){
.]7c,f
C(tTE
zwww.linuxeden.com
                        return 1;Linux伊甸园论坛\j(I]c0?DE
S

                }                Linux伊甸园论坛V8z4n$SJ(`
        }
,Gz(w8fO
9Oh}R9q5WR        printf("main proc end...\n");www.linuxeden.com4p&h!B%q&I~n
W_w

        return 1;
4FE%z4W:lX(z"`W/`9qVwww.linuxeden.comwww.linuxeden.comX
G&O |-IY
E

}
;W#q
g3u1X4R
我是在redhat9下运行的,可以出现结果,但结果和预订的不一样,你能帮我看看吗?谢谢啊!

顶部
不容错过的IBM 集群技术资源汇总
flag
版主
Rank: 7Rank: 7Rank: 7
版主



UID 19801
精华 1
积分 28(积分有什么用?)
帖子 5581
阅读权限 100
注册 2002-7-19
状态 在线
发表于 2007-5-14 20:37  资料  个人空间  短消息  加为好友 
结果是什么,问问题首先要表达清楚





上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。
顶部
 



当前时区 GMT+8, 现在时间是 2008-5-17 11:45

    Powered by Discuz! 5.5.0  © 2001-2007 Comsenz Inc.
Processed in 0.101144 second(s), 5 queries

清除 Cookies - 联系我们 - Linux伊甸园 - Archiver - WAP