马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
进程A创建一条消息队列之后向进程B发送SIGUSR1信号,进程B收到该信号之后打开消息队列并把进程的PID作为消息写入到消息队列中,进程B在写入消息之后,发SIGUSR2信号给进程A,进程A收到该信号则从消息队列中读取消息并输出。- /********************************************************************************
- *
- *
- * 消息队列和信号结合
- * author:jindouliu2024@163.com
- * date:2025.5.8
- *
- *
- * Copyright (c) 2024-2025 jindouliu2024@163.com All right Reserved
- ********************************************************************************/
复制代码- #include<stdio.h>
- #include<signal.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/msg.h>
- #include <unistd.h>
- int key;
- int msg_id,id,x;
- struct msgbuf {
- long mtype; /* message type, must be > 0 */
- int mtext[1]; /* message data */
- };
- struct msgbuf msg1;
- //信号处理函数
- void sig_handler(int signal)
- {
- //如果是接受到的信号是SIGUSR1,则执行
- if(signal == SIGUSR1){
- msg1.mtype = 1;
- x = getpid();
- msg1.mtext[0] = x;
- printf("id = %d",x);
- msgsnd(msg_id,&msg1,sizeof(msg1.mtext[0]),IPC_NOWAIT);
- printf("请输入进程id:");
- scanf("%d",&id);
- kill(id,SIGUSR2);
- }
- }
- int main()
- {
-
- //获取键值
- key = ftok(".",1);
- //创建消息队列
- msg_id = msgget(key,IPC_CREAT|IPC_EXCL|0644);
- if(msg_id == -1){
- printf("msgget error \n");
- //如果队列存在则直接打开
- msg_id = msgget(key,IPC_EXCL|0644);
- }
- printf("running\n");
- signal(SIGUSR1,sig_handler);
-
- while(1);
- return 0;
- }
复制代码- #include<stdio.h>
- #include<signal.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/msg.h>
- #include <unistd.h>
- int key;
- int msg_id,id;
- struct msgbuf {
- long mtype; /* message type, must be > 0 */
- int mtext[1]; /* message data */
- };
- struct msgbuf msg1;
- //信号处理函数
- void sig_handler(int signal)
- {
- //如果是接受到的信号是SIGUSR1,则执行
- if(signal == SIGUSR2){
- printf("22\n");
- msgrcv(msg_id,&msg1,sizeof(msg1.mtext[0]),0,0);
-
- printf("process A id is %d\n",msg1.mtext[0]);
- }
- }
- int main()
- {
-
- //获取键值
- key = ftok(".",1);
- //创建消息队列
- msg_id = msgget(key,IPC_CREAT|IPC_EXCL|0644);
- if(msg_id == -1){
- printf("msgget error \n");
- //如果队列存在则直接打开
- msg_id = msgget(key,IPC_EXCL|0644);
- }
- printf("running2\n");
- printf("请输入进程id:");
- scanf("%d",&id);
- //发送消息
- kill(id,SIGUSR1);
- signal(SIGUSR2,sig_handler);
-
- while(1);
- return 0;
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |