linux共享内存队列,linux下消息队列和共享内存示例

1.[代码][C/C++/Objective-C]代码

#include

#include

#include

#include

#include

#include

#include

void msg_show_attr(int msg_id, struct msqid_ds msg_info)

{

int ret = -1;

sleep(1);

ret = msgctl(msg_id, IPC_STAT, &msg_info);

if( -1 == ret)

{

printf(“获得消息信息失败\n”);

return ;

}

printf(“\n”);

printf(“现在队列中的字节数:%d\n”,msg_info.msg_cbytes);

printf(“队列中消息数:%d\n”,msg_info.msg_qnum);

printf(“队列中最大字节数:%d\n”,msg_info.msg_qbytes);

printf(“最后发送消息的进程pid:%d\n”,msg_info.msg_lspid);

printf(“最后接收消息的进程pid:%d\n”,msg_info.msg_lrpid);

printf(“最后发送消息的时间:%s”,ctime(&(msg_info.msg_stime)));

printf(“最后接收消息的时间:%s”,ctime(&(msg_info.msg_rtime)));

printf(“最后变化时间:%s”,ctime(&(msg_info.msg_ctime)));

printf(“消息UID是:%d\n”,msg_info.msg_perm.uid);

printf(“消息GID是:%d\n”,msg_info.msg_perm.gid);

}

int main(void)

{

int ret = -1;

int msg_flags, msg_id;

key_t key;

struct msgmbuf{

int mtype;

char mtext[10];

};

struct msqid_ds msg_info;

struct msgmbuf msg_mbuf;

int msg_sflags,msg_rflags;

char *msgpath = “/ipc/msg/”;

key = ftok(msgpath,’a');

if(key != -1)

{

printf(“成功建立KEY\n”);

}

else

{

printf(“建立KEY失败\n”);

}

msg_flags = IPC_CREAT;

msg_id = msgget(key, msg_flags|0666);

if( -1 == msg_id)

{

printf(“消息建立失败\n”);

return 0;

}

msg_show_attr(msg_id, msg_info);

msg_sflags = IPC_NOWAIT;

msg_mbuf.mtype = 10;

memcpy(msg_mbuf.mtext,”测试消息”,sizeof(“测试消息”));

ret = msgsnd(msg_id, &msg_mbuf, sizeof(“测试消息”), msg_sflags);

if( -1 == ret)

{

printf(“发送消息失败\n”);

}

msg_show_attr(msg_id, msg_info);

msg_rflags = IPC_NOWAIT|MSG_NOERROR;

ret = msgrcv(msg_id, &msg_mbuf, 10,10,msg_rfla

共享内存示例代码如下:

#include

#include

#include

#include

typedef int sem_t;

union semun {

int val;

struct semid_ds *buf;

unsigned short *array;

} arg;

sem_t CreateSem(key_t key, int value)

{

union semun sem;

sem_t semid;

sem.val = value;

semid = semget(key,value,IPC_CREAT|0666);

if (-1 == semid)

{

printf(“create semaphore error\n”);

return -1;

}

semctl(semid,0,SETVAL,sem);

return semid;

}

/*

struct sembuf{

ushort sem_num;

short sem_op;

short sem_flg;

};

*/

void SetvalueSem(sem_t semid, int value)

{

union semun sem;

sem.val = value;

semctl(semid,0,SETVAL,sem);

return ;

}

int GetvalueSem(sem_t semid)

{

union semun sem;

return semctl(semid,0,GETVAL,sem);

return sem.val;

}

void DestroySem(sem_t semid)

{

union semun sem;

sem.val = 0;

semctl(semid,0,IPC_RMID,sem);

}

int Sem_P(sem_t semid)

{

struct sembuf sops={0,+1,IPC_NOWAIT};

return (semop(semid,&sops,1));

}

int Sem_V(sem_t semid)

{

struct sembuf sops={0,-1,IPC_NOWAIT};

return (semop(semid,&sops,1));

}

static char msg[]=”你好,共享内存\n”;

int main(void)

{

key_t key;

int semid,shmid;

char i,*shms,*shmc;

struct semid_ds buf;

int value = 0;

char buffer[80];

pid_t p;

key = ftok(“/ipc/sem/”,’a');

shmid = shmget(key,1024,IPC_CREAT|0604);

semid = CreateSem(key,1);

p = fork();

if(p > 0)

{

/* 父进程 */

/* 建立共享内存 */

shms = (char *)shmat(shmid,0,0);

memcpy(shms, msg, strlen(msg)+1);

sleep(10);

Sem_P(semid);

shmdt(shms);

DestroySem(semid);

}

else if(p == 0)

{

shmc = (char *)shmat(shmid,0,0);

Sem_V(semid);

printf(“共享内存的值为:%s\n”,shmc);

shmdt(sg_

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值