当前位置: 首页 > news >正文

2024.02.23作业

1. 尝试处理普通信号

#include "test.h"#define MAXSIZE 128void handler(int signo)
{if (SIGINT == signo){printf("用户按下了 ctrl + c 键\n");}
}int main(int argc, char const *argv[])
{if (signal(SIGINT, SIG_IGN) == SIG_ERR){perror("signal error");return -1;}if (signal(SIGINT, SIG_DFL) == SIG_ERR){perror("signal error");return -1;}if (signal(SIGINT, handler) == SIG_ERR){perror("signal error");return -1;}while (1){printf("我真的还想再活五百年\n");sleep(1);}return 0;
}

2. 尝试捕获或忽略SIGKILL信号

#include "test.h"#define MAXSIZE 128void handler(int signo)
{if (SIGINT == signo){printf("用户按下了 ctrl + c 键\n");}if (SIGKILL == signo){printf("捕获了 SIGKILL 信号\n");}
}int main(int argc, char const *argv[])
{if (signal(SIGKILL, SIG_IGN) == SIG_ERR){perror("signal error");return -1;}if (signal(SIGKILL, handler) == SIG_ERR){perror("signal error");return -1;}if (signal(SIGKILL, SIG_DFL) == SIG_ERR){perror("signal error");return -1;}while (1){printf("我真的还想再活五百年\n");sleep(1);}return 0;
}

3. 使用SIGCHLD信号回收僵尸进程

#include "test.h"#define MAXSIZE 128void handler(int signo)
{if (SIGCHLD == signo){while (waitpid(-1, NULL, WNOHANG) > 0);}
}int main(int argc, char const *argv[])
{if (signal(SIGCHLD, handler) == SIG_ERR){perror("signal error");return -1;}for (int i = 0; i < 10; i++){if (fork() == 0){sleep(1);exit(EXIT_SUCCESS);}}while (1);return 0;
}

4. 模拟出牌案例

#include "test.h"#define MAXSIZE 128void handler(int signo)
{if (SIGALRM == signo){printf("系统为你随机出了一张牌\n");alarm(5);}
}int main(int argc, char const *argv[])
{if (signal(SIGALRM, handler) == SIG_ERR){perror("signal error");return -1;}alarm(5);char ch = 0;while (1){scanf("%c", &ch);getchar();printf("您出的牌为:%c\n", ch);alarm(5);}return 0;
}

5. 验证发送信号函数

#include "test.h"#define MAXSIZE 128void handler(int signo)
{if (SIGUSR1 == signo){printf("造化弄人呀\n");raise(SIGKILL);}
}int main(int argc, char const *argv[])
{if (signal(SIGUSR1, handler) == SIG_ERR){perror("signal error");return -1;}pid_t pid = fork();if (pid > 0){while (1){printf("我真的还想再活五百年\n");sleep(1);}}else if (pid == 0){sleep(5);printf("我是子进程,我要独立啦!\n");kill(getpid(), SIGUSR1);while (1){printf("富贵险中求\n");sleep(1);}}return 0;
}

6. 消息队列

#include "test.h"struct msgbuf
{long mtype;char mtext[1024];
};#define MSGSIZE sizeof(struct msgbuf) - sizeof(long)int main(int argc, char const *argv[])
{key_t key = 0;if ((key = ftok("/", 'k')) == -1){perror("ftok error");return -1;}printf("ftok success key = %#x\n", key);int msgid = -1;if ((msgid = msgget(key, IPC_CREAT|0664)) == -1){perror("msgget error");return -1;}printf("msgget success msgid = %d\n", msgid);struct msgbuf sbuf;while (1){bzero(sbuf.mtext, sizeof(sbuf.mtext));printf("请输入当前消息的类型:");scanf("%ld", &sbuf.mtype);getchar();printf("请输入消息正文:");fgets(sbuf.mtext, sizeof(sbuf.mtext), stdin);sbuf.mtext[strlen(sbuf.mtext) - 1] = 0;msgsnd(msgid, &sbuf, MSGSIZE, 0);printf("发送成功\n");if (strcmp(sbuf.mtext, "quit") == 0){break;}}return 0;
}
#include "test.h"struct msgbuf
{long mtype;char mtext[1024];
};#define MSGSIZE sizeof(struct msgbuf) - sizeof(long)int main(int argc, char const *argv[])
{key_t key = 0;if ((key = ftok("/", 'k')) == -1){perror("ftok error");return -1;}printf("ftok success key = %#x\n", key);int msgid = -1;if ((msgid = msgget(key, IPC_CREAT|0664)) == -1){perror("msgget error");return -1;}printf("msgget success msgid = %d\n", msgid);struct msgbuf rbuf;while (1){bzero(rbuf.mtext, sizeof(rbuf.mtext));msgrcv(msgid, &rbuf, MSGSIZE, 1, 0);printf("收到的消息为:%s\n", rbuf.mtext);if (strcmp(rbuf.mtext, "quit") == 0){break;}}return 0;
}

7. 使用消息队列完成两个进程间通信

#include "test.h"struct msgbuf
{long mtype;char mtext[1024];
};#define MSGSIZE sizeof(struct msgbuf) - sizeof(long)void send(int msgid, long msgtype)
{struct msgbuf sbuf;while (1){bzero(sbuf.mtext, sizeof(sbuf.mtext));printf("请输入消息正文:");fgets(sbuf.mtext, sizeof(sbuf.mtext), stdin);sbuf.mtext[strlen(sbuf.mtext) - 1] = 0;sbuf.mtype = msgtype;msgsnd(msgid, &sbuf, MSGSIZE, 0);printf("发送成功\n");if (strcmp(sbuf.mtext, "quit") == 0){break;}}
}void receive(int msgid, long msgtype)
{struct msgbuf rbuf;while (1){bzero(rbuf.mtext, sizeof(rbuf.mtext));printf("\r");msgrcv(msgid, &rbuf, MSGSIZE, msgtype, 0);printf("收到的消息为:%s\n", rbuf.mtext);printf("请输入消息正文:");fflush(stdout);if (strcmp(rbuf.mtext, "quit") == 0){break;}}
}int main(int argc, char const *argv[])
{key_t key = 0;if ((key = ftok("/", 'k')) == -1){perror("ftok error");return -1;}printf("ftok success key = %#x\n", key);int msgid = -1;if ((msgid = msgget(key, IPC_CREAT|0664)) == -1){perror("msgget error");return -1;}printf("msgget success msgid = %d\n", msgid);int flag;puts("请选择:");puts("1. 主发子收");puts("2. 主收子发");printf("请输入:");scanf("%d", &flag);getchar();pid_t pid = fork();if (pid > 0){if (flag == 1){send(msgid, 1);}else if (flag == 2){receive(msgid, 1);}}else if (pid == 0){if (flag == 1){receive(msgid, 2);}else if (flag == 2){send(msgid, 2);}}return 0;
}

http://www.lryc.cn/news/306779.html

相关文章:

  • 倒模专用制作耳机壳UV树脂:改性丙烯酸树脂
  • chatgpt:还有哪些人工智能和科技值得关注?
  • LeetCode 2997.使数组异或和等于K的最少操作次数
  • 计算机设计大赛 深度学习大数据物流平台 python
  • WPF 附加属性+控件模板,完成自定义控件。建议观看HandyControl源码
  • 编程笔记 Golang基础 040 defer、panic 和 recover
  • 通过redfish协议实现服务器固件升级、从虚拟光驱启动自检盘并等待完成,最后截图保存
  • ARM 版银河麒麟桌面系统下 Qt 开发环境搭建指南
  • 架构面试题汇总:缓存(二)
  • 【docker入门】1-
  • 微信小程序-全局配置
  • 【Android】性能优化之内存、网络、布局、卡顿、安装包、启动速度优化
  • 第3.6章:StarRocks数据导入——DataX StarRocksWriter
  • 【非递归版】归并排序算法(2)
  • [C++]C++实现本地TCP通讯的示例代码
  • Sora - 探索AI视频模型的无限可能
  • 【JavaScript 漫游】【022】事件模型
  • 【加密算法】RSA非对称加密算法简介
  • 深入理解 JavaScript 对象原型,解密原型链之谜(上)
  • 产品经理学习-产品运营《什么是SOP》
  • 大数据Hadoop生态圈
  • 算法简介:查找与算法运行时间
  • 零基础C++开发上位机--基于QT5.15的串口助手(三)
  • Facebook的虚拟社交愿景:元宇宙时代的新起点
  • 【深度学习笔记】4_6 模型的GPU计算
  • 留学申请过程中如何合理使用AI?大学招生官怎么看?
  • vue2与vue3的diff算法有什么区别
  • ES小总结
  • vue2与vue3中父子组件传参的区别
  • 使用vuetify实现全局v-alert消息通知