标题: 急!求教关于共有内存的问题
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~~~~~
c`Q5?M+|N还有一个要求是2个子进程要生成可执行程序后,才用主进程启动然后主进程与子进程之间,对共有内存进行互动操作

顶部
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[] )
]`*B*j#swww.linuxeden.com{
(iq#S*jX;p(l|3g        d/Mwww.linuxeden.com    SHARED_MEMORY    *mSharedMemory    = NULL; f/y&t-Xwa-Z3g
    struct    shmid_ds    *shm_ds        = NULL;
5J6L\@C\"_#jg    int    mShmId            = 0;   
I!^l
[2seX

`%m q?}V ?&D)K    mShmId = shmget(MAIL_SHM_KEY_MAILSEND,sizeof( MAIL_SEND_SET_ST ), 0777 | IPC_CREAT );
(`&`K3C^;[7~|    if ( mShmId == -1 )
"w-V*P4D&ZLinux伊甸园论坛    mShmId = shmget( MAIL_SHM_KEY_MAILSEND, 0, 0777 );        bp{5B G2G?d+_X@
        if( mShmId == -1 ){
S#g7~0^-x!O@?$cLinux伊甸园论坛            return 1;M}7P1LoUiy#W$p.m
        }
X;ado-U        aSubRet = shmctl( mShmId, IPC_RMID, shm_ds );
        UK J8cn7n4A        if( aSubRet == -1 ){!wf;\:p-^ V
            return 1;
        ^$kvTe6cX.\www.linuxeden.com        }
A4Z,Y8N|`~9i        mShmId = shmget( (key_t)MAIL_SHM_KEY_MAILSEND, sizeof(MAIL_SEND_SET_ST), 0777 | IPC_CREAT);www.linuxeden.com
g'i'V3m(M!j`

        if( mShmId == -1 ){
y3K3dB7a;C+tXAX            return 1;
[o0ol$E8v        }
c'Y _ ?b.}W8^

    }5zsb*jaQ        U#h
{Uj"?Q&J'p-Ob,}Y
    mSharedMemory = (MAIL_SEND_SET_ST*)shmat(mShmId, (void *)0, 0);
'U'K0O,i%?W;q    if( (ADDR)mSharedMemory <= 0 )Linux伊甸园论坛 w-G3^+~,yBO
    {
k7`!aAuA swc        return 1;
O9\Pe!l    }
9odq&c6_U8ON 2B'G$mw+``
    memset( mSharedMemory, 0, sizeof(MAIL_SEND_SET_ST) );!k1Q:j"j7evR        q

!j@Bd.?V(?(wdwww.linuxeden.com    mSharedMemory->index = 1;Linux伊甸园论坛,g
p%uBcj_6N


^K;x#O-j6Z    execv("subProc1", );
%h9h3{x,dK3IO    printf("SubProc1 Start\n");
2j0WhkQh1dwww.linuxeden.com    execv("subProc2", );
]`q `z}
Y ELinux伊甸园论坛
    printf("SubProc2 Start\n");
t3Fe&ktV-ENu^&Q    printf("End Main Proc\n");
        B:b unm(kJh
n
    while( 1 )
y*L5n}#}FAT?    {
F g'QVo        t    }
[V"[xD3l.UV*^
9`c0k!v:thwww.linuxeden.com}
"[(gL'|W
VFhFwww.linuxeden.com
这段代码改如何完善啊?

顶部
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        Linux伊甸园论坛B,] N.py8wpB
UI3yIKD7d.o
typedef struct Shared_Memory{
,QQ3gREnfLinux伊甸园论坛        int        index;
B3t,VC        T9Kc!@}SHARED_MEMORY;
g-c KP-}({{
$[a~E?m8Sint main( int argc, char *argv[] )
y#n%i3Bf/q C,Q`{Linux伊甸园论坛%}        m+W5e&e
        SHARED_MEMORY        *mSharedMemory        = NULL;TT5|+G&skX!`u/?{ UD
        struct        shmid_ds        *shm_ds                = NULL;www.linuxeden.comnY*q:m-E4WlS"Ft
        int        mShmId                        = 0;       
w(l:Z BJ/d
v3xA*~N'z&w5w        mShmId = shmget(MAIL_SHM_KEY_MAILSEND,sizeof( MAIL_SEND_SET_ST ), 0777 | IPC_CREAT );
-h-YN        a9U3v {        if ( mShmId == -1 )        I? N4x9|%`
h8I@d

                mShmId = shmget( MAIL_SHM_KEY_MAILSEND, 0, 0777 );
4q,O8a+N?#T{                if( mShmId == -1 ){
a^r@ G                        return 1;www.linuxeden.comY
aL/B.` bMn

                }
n~E%m W'uW                aSubRet = shmctl( mShmId, IPC_RMID, shm_ds );www.linuxeden.comf `
X2P,\T$Z4Z#V

                if( aSubRet == -1 ){
^o#H*o0q(N/~                        return 1;
2?qKQ&j5A+z                }&csym4E3wF-U;y$p5L
                mShmId = shmget( (key_t)MAIL_SHM_KEY_MAILSEND,         uY7]2|-e
Q[l8j

                                         sizeof(MAIL_SEND_SET_ST), -K}mxh-Kp
                                         0777 | IPC_CREAT);
PtP RJIv^www.linuxeden.com                if( mShmId == -1 ){3P z Hl!y]Rb
                        return 1;y1M&`X+J
                }
!Z:g|)G0EZ
V#nwww.linuxeden.com
        }
-L5B_
G}"Wi1d
       
1n5I{
\F2Dy~4tG
        mSharedMemory = (MAIL_SEND_SET_ST*)shmat(mShmId, (void *)0, 0);
Y-|0H];{9z~qwww.linuxeden.com        if( (ADDR)mSharedMemory <= 0 )[$J!C.NTx5B
        {G2E5V;~&y#e`
                return 1;
T+K4w3Wv L/@Z        }Linux伊甸园论坛s1hi]rW
       
0egZZ"bf*r
ou5v8r
        memset( mSharedMemory, 0, sizeof(MAIL_SEND_SET_ST) );
1D K?y-D9ZZ@www.linuxeden.com
#BS*q&E6W5G(@YDpwww.linuxeden.com        mSharedMemory->index = 1;
f%Eg%C2Q%r
*trI%mw%Kwww.linuxeden.com

KxPR)e
        execv("subProc1", );
_#j+n+Ht?#mx        printf("SubProc1 Start\n");3f.^        J0D~W$I
z


dIVg7rN5Z2q        execv("subProc2", );-Yz\l:?:Y%RS
        printf("SubProc2 Start\n");L xMjCR#X

9r1VW.D"He.j3_[v s        printf("End Main Proc\n");W]
f;j~

        while( 1 )
7?#{ki[[(t        {
!F
K*TE3q*i~8OR%u
        }www.linuxeden.com6e`Z
y4}X

        *VB(ft
W%FN

}(KfmP6s&Lh
这段代码改如何完善啊?

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



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

顶部
flag
版主
Rank: 7Rank: 7Rank: 7
版主



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





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



UID 195998
精华 0
积分 0(积分有什么用?)
帖子 6
阅读权限 10
注册 2007-5-12
状态 离线
发表于 2007-5-14 12:24  资料  个人空间  短消息  加为好友 
这段代码我已经看明白了,我根据这段代码自己写了如下的三段代码,不过结果不对!
Tf/o']~3TmJ+E-amproc.h
k`M6K%V4vs1R+KhG#include <stdio.h>        _S1p0w        i9jEi
K

#include <sys/shm.h>
U|0bkL){F
CLinux伊甸园论坛
#include <sys/ipc.h>
q/B.x,g
i ]
|
#include <sys/types.h>
j)I5x ~-M%AMIwww.linuxeden.com#include <unistd.h>
F$^7Z$V2r
I0~x4B
#include <string.h>
,?2]EC,@.p,R#include <errno.h>
UGE5?a&rqE#define shm_key (key_t)0x8000%m[DJ w*k8h
Linux伊甸园论坛\+tB-Q
L[ H/[6W

typedef struct share_memory{` xc ~#[/s
T

        int index;
,CS(v        Df+l}SHARE_MEMORY;
B.c:Ww\C*zi|)Zh*u
subproc1.cC
F9xZ4^]5{4Q }V

#include "proc.h"H^|
`B%Nx4_

#include <stdio.h>
9j x,jk\vE.O#include <sys/shm.h>
Pr8m,xsw#include <sys/ipc.h>_V5|KF PH/ss:h
#include <sys/types.h>
+dk)z'B8z,dwww.linuxeden.com#include <unistd.h>        YaX'uUbM;]c
#include <string.h>
%GcK1[8n        fjv#include <errno.h>wV8n        fi8JWnkn

y;NA[X!yl8]2fZYint main(int argc,char *argv[])www.linuxeden.com2fO5}h8l2GvQ
{www.linuxeden.com ut        u'Ga%]7]
        int shmid = 0;       
2s#FTs xwww.linuxeden.com        SHARE_MEMORY *mshare_memory;Linux伊甸园论坛b]8q2N)y6Kvzf

[q        \,xQft4b*eAwww.linuxeden.com        shmid = shmget(shm_key,0,0777);
xB@b/?i"^W,TLinux伊甸园论坛        if(shmid == -1)
,r
CA+@X/nN)o+^Linux伊甸园论坛
        {
"@HNm;]m        g                printf("subproc1  error %d\n",errno);Linux伊甸园论坛KJSh(P$|Y-Jp
        };c7pz:N&rw

}#F!hA`~9Z&g6ALinux伊甸园论坛        mshare_memory = (SHARE_MEMORY*)shmat(shmid,0,0);Linux伊甸园论坛
T4o7oK4^*j N


Wg
g1gEe
`-Rn(^www.linuxeden.com
        printf("subproc1 start...\n"); DZx`${yw Xl
        while(mshare_memory->index <6)
v"mUZ        j`$U"C(S0zLinux伊甸园论坛        {                B+ocFou}
                printf("index= %d\n ",mshare_memory->index );
#ef!z,nkj                mshare_memory->index++;
-v'ek'lt-?%n _]        }
e/Q        xhD#]8xA'}Linux伊甸园论坛
B"Z2l*NZ9F)mvSKXR6l!me
        return 1;4L]
i"uoM]
u

}
8[7wFM z,d-r{tV
n sX\!W

subproc2.c
5Y4fgAlsJ0U*HaF#include "proc.h")aT4L6|.m$l GA
#include <stdio.h>
O1\;oi4eT#include <sys/shm.h>*[3v9g}8j?        m$eg
#include <sys/ipc.h>
_j3`W9n?({Linux伊甸园论坛#include <sys/types.h>
*nw
I$V l'uj        p
#include <unistd.h>pz Al2m
#include <string.h>
a~H D)BBg#include <errno.h>Linux伊甸园论坛rQHB@(K1UW

7d P6l\$D7vILint main(int argc,char *argv[])Linux伊甸园论坛2k4_LDtw
{Y+t
X.I$O
w0M

        int shmid = 0;        @3b!@or
d9M5Kr

        SHARE_MEMORY *mshare_memory;
%l{
f)dg(r

v*@5Q8Vp$L        L#iq:Y"~        shmid = shmget(shm_key,0,0777);
!C~IQ`1Duwww.linuxeden.com        if(shmid == -1)
b!R
A+R3F1?1J'A&L^
        {
YTQip1s5A,|                printf("subproc2 error %d\n",errno);
k$r'|KTOwww.linuxeden.com        }bEb:Tik$n        M/B

4F(p_'K^9OCLinux伊甸园论坛        mshare_memory = (SHARE_MEMORY*)shmat(shmid,0,0);P2L*n~D?G.d2~

!kNaVwBvc        printf("subproc2 start...\n");IZPI YS,IygQ
        while(mshare_memory->index >5 && mshare_memory->index<11)
+la(f8u1s,bkw        {               
wU@"Q*T,Jm!I+~0p                printf("index= %d\n ",mshare_memory->index );ZRV [E
                mshare_memory->index++;Linux伊甸园论坛kht
S1j

        }|HUpz
        return 1;
8Z/E%F6I k}3Fz `*eT
www.linuxeden.comby@)I%S&lC'ss
proc.cIz7ra*M;j'S'vP"H!\
#include "proc.h"`.Yna,v5S4E
#include <stdio.h> k/^?;hf*A0n
#include <sys/shm.h>
S a)k&R2b/K3meA9yLinux伊甸园论坛#include <sys/ipc.h>(M jon Al|
#include <sys/types.h>
hv_KA;n"t+?B#include <unistd.h>?%}@C5Fv&M'G[
P

#include <string.h>
4V G*z"@Q)mW9w4_*N!I#include <errno.h>
C*s$k,@uwww.linuxeden.comLinux伊甸园论坛7Z;`!c }Ov
int main(int argc,char *argv[])'U O Y B M-dJ+N        ]
{
ca9|(S,?pwww.linuxeden.com        int shmid = 0;
8kh9VP,w{%z.t*KQa        int shmret;
|8o(Am y        SHARE_MEMORY *msharememory = NULL;www.linuxeden.com!Kba*G5wq:[
]oe


|n2bBc&Piwww.linuxeden.com        struct shmid_ds         *shm_ds        = NULL;&S+ziN        {
        shmid = shmget(shm_key,sizeof(SHARE_MEMORY ), 0777 | IPC_CREAT );Z{s        u-k&m g {)U
        if ( shmid == -1 )Linux伊甸园论坛"Wt|%B6L[
        {
"UQr Y1Ikg                shmid = shmget( shm_key, sizeof(SHARE_MEMORY ), 0777 );
*k$t OD/l4yLinux伊甸园论坛                if( shmid== -1 ){F8G2GA"iz
                        return 1;A9F:_/n]-k[DU c
                }#K(Kf3]I

bpZ/@ f&O        G}:c)yMLinux伊甸园论坛                shmret = shmctl( shm_key, IPC_RMID, shm_ds );www.linuxeden.comE'\u~#U6?:l2r&E? K
                if( shmret == -1 ){
k3Rr        ood^1nBb                        return 1;l'KK]+l
                }Linux伊甸园论坛 ENSx,V
c

^aN i9Aj$p
                shmid = shmget( shm_key,sizeof(SHARE_MEMORY ),0777 | IPC_CREAT);
2S u5WFT2r                if( shmid == -1 ){www.linuxeden.comBupn.Wx.LWM
                        return 1;*y6e+xq%P9\2}k
                }
6mK*|e/s$N        }
`Zp.\"i6D#[
2j3f        d!NMH'm8Q"h        msharememory = (SHARE_MEMORY*)shmat(shmid, (void *)0, 0);
@-rv&Bc6Y        /*if( (ADDR) msharememory <= 0 )
H`-t
?:F5Vv
        { }fx4y*r.Z Lr n
                return 1;,b*i5B}1r        f        a3Y
        }*/
+NSz0r8^Q f FF!nB&`
[8h

        memset( msharememory,0,sizeof(SHARE_MEMORY));
,D#r\y:tl        msharememory->index = 1;
$AQo9[ ]3{I        printf("main proc start...\n");w;~2y}po7M
        printf("index = %d",msharememory->index);,y#U5eAW1b
3fUr^6Z
        if(execv("/root/kevin/subproc1",argv ) == -1)
v6tdE xg0hwww.linuxeden.com        {
/J_.D`q$`                printf("error subproc1 &d\n",errno);
g(W1\kr)f$Ewww.linuxeden.com        }
s6I&i'U0PALinux伊甸园论坛
S
tW+U4?}
        if(execv("/root/kevin/subproc2",argv ) == -1)#g.o@:Eq2G'\
        {
;e\0O!y)N9_*C                printf("error subproc2 &d\n",errno);)wc7xK9m)_i'P
        }*[Q d p,oO,M5N'u{
                while(1)Linux伊甸园论坛c9T9HFc'_"s;g
        {Linux伊甸园论坛7n!E s1xT9r
        }Linux伊甸园论坛V
NKY&vq%Qy ~


H,ix*k rGP%~;bwww.linuxeden.com        if(msharememory->index == 11)
m'l#lcM        {www.linuxeden.comS7r_ w6vLO
                shmret = shmctl( shm_key, IPC_RMID, shm_ds );
WPZV G+@www.linuxeden.com                if(shmret = -1){\ ]0N0?{
R3E`-\6P&v

                        return 1;www.linuxeden.com)D$@ i&s
z+L,Y

                }               
Gl$T.XM.u h        }
E1`+W
MK)_ZLinux伊甸园论坛
n@'lVP"d!TtX}
        printf("main proc end...\n");
S1`Oq3~        return 1; y*A&^ta+@$r[
www.linuxeden.comyT        Y~:^
}www.linuxeden.com:n
x{:d-_Gw)z5F

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

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



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





上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。
顶部
不容错过的IBM 集群技术资源汇总
 



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

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

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