硬链接和软链接
硬链接类似指针,语法是:ln target linkname
你新建一个文件,然后ln a.c c.c 你修改其中任何一个文件都会体现出来。
都指到同一文件索引节点。
消息队列
新建魔数->新建队列->读写操作->ok。
对于消息队列的底层实现其实还是有点不明白,包括为什么可以再ftok里面的第二个参数中IPC_CREATE|0660 这样写,以及0660是如何计算出来的,在百度上基本没找到。如果那个博友知道烦请告知。
从代码来分析:
/*
*queen.c
*
* Created on: 2014-12-9
* Author: Administrator
*/
#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<stdlib.h>
#include<string.h>
#define M_TEXT 1024
typedef struct msg_buf
{
long msgtype;
char mtext[M_TEXT];
}msgbuf;
int main(int argc,char * argv[])
{
int key=0;
int queen_id=0;
int ret=0;
key=ftok(".",97);
printf("生成的魔數:%d",key);
printf("開始創建消息隊列\n");
queen_id=msgget(key,IPC_CREAT|0660);
if(-1 == queen_id)
{
printf("createmsg_queen failed");
perror("error:");
exit(-1);
}
printf("創建消息隊列成功:%d",queen_id);
msgbuf msg;
memset(&msg,0,sizeof(msg));
msg.msgtype=0002;
strcpy(msg.mtext,"i loveyou!!!!");
printf("msg.txtlength:%d-%d=%d\n",sizeof(msg),sizeof(msg.msgtype),sizeof(msg)-sizeof(msg.msgtype));
int i=0;
while(i<10)
{
ret=msgsnd(queen_id,&msg,sizeof(msg.mtext),0);
if(-1==ret)
{
printf("寫入失敗\n");
perror("error:");
ret=msgctl(queen_id,IPC_RMID,NULL);
exit(-1);
}
printf("寫入消息隊列成功\n");
//sleep(300);
i++;
}
// ret=msgctl(queen_id,IPC_RMID,NULL);
if(-1==ret)
{
printf("删除失败\n");
perror("error:");
}
return 0;
}
key=ftok(".",97);
魔数,其实就是通过某种计算方式,获取到当天目录的文件索引号与97进行了某种运算,结果可以唯一的定位这个消息队列,如果相等的话,就可以算作我,你,他要找的是同一个消息队列,这也是为什么通过ftok就可以定位的唯一的消息队列的原因。
queen_id=msgget(key,IPC_CREAT|0660);
这是在获取或者说创建消息队列,IPC_CRATE如果存在就返回msgid,如果不存在就创建新的然后返回Msgid,后面还有一个IPC_EXCL如果存在消息队列的话,就会报错。至于权限控制位,在网上没有详细的说明,所以没办法在这里做过多的说明。
msg.msgtype=0002;
这个是定义这个消息队列的一个消息的标示,如果你往消息队列里面写信息,你在读的时候这个是否匹配,决定了你是否能找到你刚才写进去的。如果在多进程的话,我想我可能会以这个进程的ID作为这个字段的值。
ret=msgsnd(queen_id,&msg,sizeof(msg.mtext),0);
第一个是msgget到的返回值,然后是默认结构体的地址,以及是否是阻塞还是非阻塞的选项。
基本上写的就是这样,其实还是满简单的。
我写了10次进去,所以有10条信息。
读:
/*reated on: 2014-12-9
* Author: Administrator
*/
#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<stdlib.h>
#include<string.h>
#define M_TEXT 1024
typedef struct msg_buf
{
long msgtype;
char mtext[M_TEXT];
}msgbuf;
int main(int argc,char * argv[])
{
int key=0;
int queen_id=0;
int ret=0;
key=ftok(".",97);
printf("生成的魔數:%d\n",key);
printf("開始創建消息隊列\n");
queen_id=msgget(key,IPC_CREAT|0660);
if(-1 == queen_id)
{
printf("createmsg_queen failed\n");
perror("error:\n");
// exit(-1);
}
printf("获取消息隊列成功:%d\n",queen_id);
msgbuf msg;
memset(&msg,0,sizeof(msg));
msg.msgtype=0002;
// strcpy(msg.mtext,"ilove you!!!!");
printf("msg.txtlength:%d-%d=%d",sizeof(msg),sizeof(msg.msgtype),sizeof(msg)-sizeof(msg.msgtype));
ret=msgrcv(queen_id,&msg,sizeof(msg.mtext),0001,0);
if(-1==ret)
{
printf("读取失敗\n");
perror("error:");
exit(-1);
}
printf("读取的消息:%s\n",msg.mtext);
printf("寫入消息隊列成功\n");
return 0;
}
问题:如果我在写的循环里面加了一个sleep函数,然后循环只会执行一次。不知道为什么?