欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 培训 > 信号队列。

信号队列。

2025/10/23 14:32:17 来源:https://blog.csdn.net/xh202105/article/details/141685978  浏览:    关键词:信号队列。

建立两个.c 建立子父进程,父进程发送消息到队列,子进程读取队列,另一个同样

这个程序不是很理想,无法办到一个程序输入quit,两个都退出

pid大于0为父程序,通过ftok函数创建消息队列,再是msgget获得队列的id号,接着的结构体是函数msgsnd函数第二个参数,其中的mtxet是用来存储正文信息的

#include <myhead.h>
struct msgbuf
{long mtype;char mtext[1000];
};
#define leng sizeof(struct msgbuf) - sizeof(long)
int main(int argc, const char *argv[])
{pid_t pid = fork();if (pid > 0){key_t key = ftok("./", 'B');if (key == -1){perror("ftok");return -1;}printf("键:%#x\n", key);int msgID = msgget(key, IPC_CREAT | 0664);if (msgID == -1){perror("msgget");return -1;}printf("msgID = %d\n", msgID);struct msgbuf send;while (1){printf("消息类型:");scanf("%ld", &send.mtype);getchar();printf("输入消息的正文:");fgets(send.mtext, sizeof(send.mtext), stdin);send.mtext[strlen(send.mtext) - 1] = '\0';msgsnd(msgID, &send, leng, 0);if (strcmp(send.mtext, "quit") == 0){kill(pid, SIGTERM);break;}}if (msgctl(msgID, IPC_RMID, NULL) == -1){printf("删除失败\n");return -1;}wait(NULL);//阻塞回收exit(EXIT_SUCCESS);}else if (pid == 0){key_t key = ftok("./", 'C');if (key == -1){perror("ftok");return -1;}int msgID = msgget(key, IPC_CREAT | 0664);if (msgID == -1){perror("msgget");return -1;}struct msgbuf rcv;while (1){msgrcv(msgID, &rcv, leng, 0, 0);printf("%s\n", rcv.mtext);if (strcmp(rcv.mtext, "quit") == 0){break;}}exit(EXIT_SUCCESS);}else{perror("fork");return -1;}
}

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词