在Linux操作系统中,消息传递机制是进程之间进行通信的一种方式。它可以使不同进程之间在各自的地址空间中进行通信,相互之间不会干扰,从而提高了系统的安全性和可靠性。本文将介绍。
1. 消息队列
消息队列是进程之间通信的一种方式,是Linux内核提供的一种数据结构。消息队列允许一个进程往队列中写入消息,而另一个进程则可以从队列中读取这些消息。每个消息都有一个类型和一个数据,进程可以通过消息类型来选择读取哪些消息。
在Linux中,使用消息队列的基本步骤如下:
(1)创建消息队列
通过系统调用msgget()函数可以创建消息队列。
#define IPC_CREATE 01000 //创建一个消息队列
#define KEY 1234 //消息队列键值
key_t key = ftok(“.”, KEY); //根据路径名和键值创建一个key
int msgqid = msgget(key, IPC_CREAT|0666);
上述代码使用ftok()函数根据当前路径和一个唯一的键值生成一个key,然后使用msgget()函数创建消息队列,并返回消息队列的标识符msgqid。IPC_CREAT表示如果不存在该消息队列则创建它。
(2)写入消息
通过将消息结构体msgbuf发送到消息队列中即可写入一条消息。
#include
struct msgbuf {
long mtype; //消息类型
char mtext[1024]; //消息文本
};
struct msgbuf msg;
msg.mtype = 1;
strcpy(msg.mtext, “This is a message”);
msgsnd(msgqid, &msg, strlen(msg.mtext), 0);
上述代码中,首先定义了一个消息结构体msgbuf,其中mtype表示消息的类型,mtext表示消息的内容。然后将需要写入的消息赋值到msg中,使用msgsnd()函数将该消息写入到消息队列中。
(3)读取消息
通过调用msgrcv()函数来读取消息。
struct msgbuf msg;
msgrcv(msgqid, &msg, 1024, 1, 0); //读取消息队列中等待的之一条类型为1的消息
上述代码中,调用msgrcv()函数读取消息队列中类型为1的消息,将消息存储在msg中。
(4)删除消息队列
消息队列使用完后需要使用msgctl()函数进行删除。
msgctl(msgqid, IPC_RMID, NULL);
上述代码中,调用msgctl()函数删除消息队列。IPC_RMID表示删除指定的消息队列。
2. 信号量
信号量是Linux内核提供的另一种进程间通信机制。它可以用于提供对临界资源的互斥访问,从而保证了多个进程同时访问同一资源时的安全性。
在Linux中,使用信号量的基本步骤如下:
(1)创建信号量
使用semget()函数可以创建一个新的或者获取一个已有的信号量。
#define KEY 1234
key_t key = ftok(“.”, KEY); //根据路径名和键值创建一个key
int semid = semget(key, 1, IPC_CREAT|0666); //创建信号量
上述代码中,使用ftok()函数根据当前路径和一个唯一的键值生成一个key,然后使用semget()函数创建信号量,并返回信号量的标识符semid。
(2)初始化信号量
使用semctl()函数来初始化信号量。
#include
union semun {
int val; //信号量值
struct semid_ds *buf; //semid_ds结构指针
unsigned short int *array; //数组指针
struct seminfo *__buf;
};
union semun semval;
semval.val = 1;
semctl(semid, 0, SETVAL, semval); //初始化信号量中的之一个信号量为1
上述代码中,定义了一个semun结构体,然后使用semctl()函数将信号量中的之一个信号量初始化为1。
(3)P操作和V操作
使用semop()函数进行P(wt)操作和V(signal)操作。
struct sembuf sembuf;
sembuf.sem_num = 0; //信号量中的之一个信号量
sembuf.sem_op = -1; //执行P操作
sembuf.sem_ = SEM_UNDO; //防止程序意外终止导致信号量未释放
semop(semid, &sembuf, 1);
sembuf.sem_num = 0;
sembuf.sem_op = 1;
sembuf.sem_ = SEM_UNDO;
semop(semid, &sembuf, 1);
上述代码中,先定义了一个sembuf结构体,然后使用semop()函数对该信号量中的之一个信号量执行P操作和V操作。
(4)删除信号量
信号量使用完后需要使用semctl()函数进行删除。
semctl(semid, 0, IPC_RMID);
上述代码中,调用semctl()函数删除信号量。
相关问题拓展阅读:
- linux编程,进程的通信
linux编程,进程的通信
给你发个例程,一起复习一下:
#include
#include
#include
void msg_stat(int,struct msqid_ds );
main()
{
int gflags,sflags,rflags;
key_t key;
int msgid;
int reval;
struct msguf{
int mtype;
char mtext;
}msg_uf;
struct msgmbuf
{
int mtype;
char mtext;
}msg_rbuf;
struct msqid_ds msg_ginfo,msg_sinfo;
char* msgpath=”/unix/msgqueue”;
key=ftok(msgpath,’a’);
gflags=IPC_CREAT|IPC_EXCL;
msgid=msgget(key,gflags|00666);
if(msgid==-1)
{
printf(“msg create error\n”);
return;
}
//创建一个消息队列后,输出消息队列缺省属性
msg_stat(msgid,msg_ginfo);
sflags=IPC_NOWAIT;
msg_uf.mtype=10;
msg_uf.mtext=’历掘春a’;
reval=msgsnd(msgid,&msg_uf,sizeof(msg_uf.mtext),sflags);
if(reval==-1)
{
printf(“message send error\n”);
}
//发送一个消息后,输出消息队列属性
msg_stat(msgid,msg_ginfo);
rflags=IPC_NOWAIT|MSG_NOERROR;
reval=msgrcv(msgid,&msg_rbuf,4,10,rflags);
if(reval==-1)
printf(“read msg error\n”);
else
printf(“read from msg queue %d bytes\n”,reval);
//从消息队列中读出消息后,输出消息队列属性
msg_stat(msgid,msg_ginfo);
msg_sinfo.msg_perm.uid=8;//just a try
msg_sinfo.msg_perm.gid=8;//
msg_sinfo.msg_qbytes=16388;
//此处验证超级用户可以更改消息队列的缺省msg_qbytes
//注意这里设置的值大于缺省值
reval=msgctl(msgid,IPC_SET,&msg_sinfo);
if(reval==-1)
{
printf(“msg set info error\n”);
return;
}
msg_stat(msgid,msg_ginfo);
//验证设置消息队列属性
reval=msgctl(msgid,IPC_RMID,NULL);//删除消息队列
if(reval==-1)
{
printf(“unlink msg queue error\n”);
return;
}
}
void msg_stat(int msgid,struct msqid_ds msg_info)
{
int reval;
sleep(1);//只是为了后面输出时间的方便
reval=msgctl(msgid,IPC_STAT,&msg_info);
if(reval==-1)
{
printf(“get msg info error\n”);
return;
}
printf(“\散弯n”);
printf(“current number of bytes on queue is %d\n”,msg_info.msg_cbytes);
printf(“number of messages in queue is %d\n”,msg_info.msg_qnum);
printf(“max number of bytes on queue is %d\n”,msg_info.msg_qbytes);
//每个消息队列的容量(字节数)都有限制MSGMNB,值的大小因系统而异。在创建新的消息队列时,肢耐//msg_qbytes的缺省值就是MSGMNB
printf(“pid of last msgsnd is %d\n”,msg_info.msg_lspid);
printf(“pid of last msgrcv is %d\n”,msg_info.msg_lrpid);
printf(“last msgsnd time is %s”, ctime(&(msg_info.msg_stime)));
printf(“last msgrcv time is %s”, ctime(&(msg_info.msg_rtime)));
printf(“last change time is %s”, ctime(&(msg_info.msg_ctime)));
printf(“msg uid is %d\n”,msg_info.msg_perm.uid);
printf(“msg gid is %d\n”,msg_info.msg_perm.gid);
}
linux 发送过消息给进程的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux 发送过消息给进程,Linux如何通过消息传递机制向进程发送信息,linux编程,进程的通信的信息别忘了在本站进行查找喔。
香港服务器首选树叶云,2H2G首月10元开通。
树叶云(www.IDC.Net)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。
文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/164776.html<