欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 产业 > 多线程与信号

多线程与信号

2025/5/19 13:46:44 来源:https://blog.csdn.net/jzkj201/article/details/141231076  浏览:    关键词:多线程与信号

消息处理 

#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <semaphore.h>
#include <signal.h>
#include <pthread.h>
struct msgbuf
{long mtype;  // 消息的标识(整数)char mtext[100];    // 消息的正文};int msg_id1;
void *t1(void *arg) {
struct msgbuf buf1;
while(1){ssize_t msgrcv_ret1 = msgrcv(msg_id1, &buf1,sizeof(buf1), 2, 0);if(-1 == msgrcv_ret1) {printf("rcv msg failed\n");}if(strcmp(buf1.mtext,"bye\n")==0){break;}printf("MSG1:%s\n",buf1.mtext);}               }
int main()
{pthread_t tid1;pthread_create(&tid1, NULL, t1, NULL);//1.创建KEY值key_t key = ftok("./", 0);if(-1 ==key){printf("creat key failed");return -1;}//2.创建消息队列int msg_id = msgget(key, IPC_CREAT | 0777);if(-1 == msg_id){printf("creat msg failed\n");return -1;}//创建KEY1//1.创建KEY值key_t key1 = ftok("./", 1);if(-1 ==key){printf("creat key failed");return -1;}//2.创建消息队列msg_id1 = msgget(key1, IPC_CREAT | 0777);if(-1 == msg_id1){printf("creat msg failed\n");return -1;}//3.往消息队列里面发送消息//需要定义一个结构体变量bufstruct msgbuf buf;//需要给结构体成员赋值buf.mtype = 1;while(1){memset(buf.mtext,0,100);//消息从键盘获取fgets(buf.mtext,100,stdin);//以回车结尾int msgsnd_ret = msgsnd(msg_id,&buf,sizeof(buf), 0); //默认是阻塞的发送if(-1 == msgsnd_ret){printf("send msg failed\n"); return -1;}if(strcmp(buf.mtext, "bye\n") == 0){break;}}msgctl(msg_id, IPC_RMID, NULL);return 0;	}
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <pthread.h>struct msgbuf
{long mtype;  // 消息的标识(整数)char mtext[100];    // 消息的正文};
int msg_id1;
void *t1(void *arg) {//需要定义一个结构体变量bufstruct msgbuf buf1;//需要给结构体成员赋值buf1.mtype = 2;while(1){memset(buf1.mtext,0,100);//消息从键盘获取fgets(buf1.mtext,100,stdin);//以回车结尾int msgsnd_ret1 = msgsnd(msg_id1,&buf1,sizeof(buf1), 0); //默认是阻塞的发送if(-1 == msgsnd_ret1){printf("send msg failed\n");return NULL;}if(strcmp(buf1.mtext, "bye\n") == 0){break;}}}
int main()
{pthread_t tid1;pthread_create(&tid1, NULL, t1, NULL);//key值key_t key = ftok("./", 0);if(-1 ==key){printf("creat key failed");return -1;}//创建消息队列int msg_id = msgget(key, IPC_CREAT | 0777);if(-1 == msg_id){printf("creat msg failed\n");return -1;}//key值key_t key1 = ftok("./", 1);if(-1 ==key1){printf("creat key failed");return -1;}//创建消息队列msg_id1 = msgget(key1, IPC_CREAT | 0777);if(-1 == msg_id1){printf("creat msg failed\n");return -1;}//接受消息的消息struct msgbuf buf;while(1){ssize_t msgrcv_ret = msgrcv(msg_id, &buf,sizeof(buf), 1, 0);if(-1 == msgrcv_ret){printf("rcv msg failed\n");}if(strcmp(buf.mtext,"bye\n")==0){break;}printf("MSG:%s\n",buf.mtext);}}

信号处理 

#include <stdio.h>
#include <fcntl.h>              
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <semaphore.h>
#include <signal.h>sem_t *space, *data;
char *p;
int shm_id;void cleanup(int sig) {// 释放信号量和共享内存sem_close(space);sem_unlink("/1");sem_close(data);sem_unlink("/2");shmdt(p);shmctl(shm_id, IPC_RMID, NULL);_exit(0);
}int main() {key_t key = ftok("./", 2);shm_id = shmget(key, 2, IPC_CREAT | 0666);p = shmat(shm_id, NULL, 0);space = sem_open("/1", O_CREAT, 0666, 1);data = sem_open("/2", O_CREAT, 0666, 0);// 注册SIGINT信号处理函数signal(SIGINT, cleanup);char *msg = "0123456789";int i = 0;while (1) {sem_wait(space);memcpy(p, msg + i, 1);sem_post(data);i = (i + 1) % 10;}// 解除映射和清理资源cleanup(0); // 虽然在无限循环中不会到达这里,但确保资源得到释放
}
#include <stdio.h>
#include <fcntl.h>              
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <semaphore.h>
#include <signal.h>sem_t *space, *data;
char *p;
int shm_id;void cleanup(int sig) {// 释放信号量和共享内存sem_close(space);sem_unlink("/1");sem_close(data);sem_unlink("/2");shmdt(p);_exit(0);
}int main() {key_t key = ftok("./", 2);shm_id = shmget(key, 2, IPC_CREAT | 0666);p = shmat(shm_id, NULL, 0);space = sem_open("/1", O_CREAT);data = sem_open("/2", O_CREAT);// 注册SIGINT信号处理函数signal(SIGINT, cleanup);while (1) {sem_wait(data);fprintf(stderr, "%s", p);sem_post(space);}// 解除映射和清理资源cleanup(0); // 虽然在无限循环中不会到达这里,但确保资源得到释放
}

版权声明:

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

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

热搜词