2024.02.23作业

news2024/10/1 17:16:52

1. 尝试处理普通信号

#include "test.h"

#define MAXSIZE 128

void 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 128

void 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 128

void 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 128

void 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 128

void 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.coloradmin.cn/o/1472304.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】---内存管理new和delete详解

一、C/C内存分布 C/C内存被分为6个区域&#xff1a; &#xff08;1&#xff09; 内核空间&#xff1a;存放内核代码和环境变量。 &#xff08;2&#xff09;栈区&#xff1a;向下增长&#xff08;存放非静态局部变量&#xff0c;函数参数&#xff0c;返回值等等&#xff09; …

帧同步原理

帧同步和状态同步区别 状态同步&#xff1a;发操作&#xff0c;收状态 帧同步&#xff1a;发操作&#xff0c;收操作 逻辑严格排序 经常会有需要排序的列表或者数组&#xff0c;比如攻击距离自己最近的敌人&#xff0c;这时候就需要将身边的敌人进行距离排序&#xff0c;一般…

在having、select子句中使用子查询

目录 在having子句中使用子查询 统计出部门平均工资高于公司平均工资的部门编号、平均工资、部门人数 在select子句中使用子查询 查询每个员工的编号、姓名、职位、部门名称 Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 在havin…

2024.2.26

1、实现信号灯集 sem.c #include<myhead.h>union semun {int val; /* Value for SETVAL */struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */unsigned short *array; /* Array for GETALL, SETALL */struct seminfo *__buf; /* Buffer …

备考2025年考研数学(一)真题练习和解析——填空题

今天距离2025年考研预计还有10个月的时间&#xff0c;看起来挺长&#xff0c;但是对于备考2025年考研的同学来说&#xff0c;必须用好每一天。为了帮助大家提升考研数学一的成绩&#xff0c;我收集整理了1987-2024年的考研数学一的真题和解析&#xff0c;并把2015-2024年十年的…

一个39岁程序员的自白,大龄程序员的出路在哪里?

一个39岁程序员的自白&#xff0c;大龄程序员的出路在哪里&#xff1f; 大龄程序员&#xff0c;最悲惨的&#xff0c;可能是但凡你发个贴&#xff0c;下面就会有类似这种人来怼你 本文来自知乎一个大龄程序员老哥&#xff08;白圣君&#xff09;的自白&#xff0c;涤生哥已经经…

现在骨传导耳机什么牌子最好?专业选购指南与避坑策略

近些年来&#xff0c;耳机行业飞速发展&#xff0c;耳机已经成为日常生活中不可或缺的伙伴&#xff0c;无论是休闲时刻还是运动健身&#xff0c;耳机都伴随着我们。然而长时间使用传统的入耳式耳机可能会导致听力受损、容易脱落和不卫生等问题。为了解决这些问题&#xff0c;满…

【GameFramework框架内置模块】3、数据表(Data Table)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录&#xff1a; https://blog.csdn.net/q7…

3 easy 26. 删除有序数组中的重复项

双指针&#xff1a; //给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 //一致 。然后返回 nums 中唯一元素的个数。 // // 考虑 nums 的唯…

服务器防漏扫

什么是漏扫&#xff1f; 漏扫是漏洞扫描的简称。漏洞扫描是一种安全测试方法&#xff0c;用于发现计算机系统、网络或应用程序中的潜在漏洞和安全弱点。通过使用自动化工具或软件&#xff0c;漏洞扫描可以检测系统中存在的已知漏洞&#xff0c;并提供相关的报告和建议&#xf…

如何在Linux部署Portainer并结合内网穿透远程管理本地Docker容器

文章目录 前言1. 部署Portainer2. 本地访问Portainer3. Linux 安装cpolar4. 配置Portainer 公网访问地址5. 公网远程访问Portainer6. 固定Portainer公网地址 前言 Portainer 是一个轻量级的容器管理工具&#xff0c;可以通过 Web 界面对 Docker 容器进行管理和监控。它提供了可…

【牛牛送书 | 第四期】《高效使用Redis:一书学透数据存储与高可用集群》带你快速学习使用Redis

前言&#xff1a; 当今互联网技术日新月异&#xff0c;随着数据量的爆炸式增长&#xff0c;如何高效地存储和管理数据成为了每个公司都必须面对的挑战。与此同时&#xff0c;用户对于应用程序的响应速度和稳定性要求也越来越高。在这个背景下&#xff0c;Redis 作为一个…

C++ 学习之函数对象

C 函数对象基本概念 在C中&#xff0c;函数对象&#xff08;Function Objects&#xff09;是一种类或结构体&#xff0c;它重载了函数调用运算符operator()&#xff0c;因此可以像函数一样被调用。函数对象有时也被称为仿函数&#xff08;Functor&#xff09;。 以下是关于C函…

备战蓝桥杯---基础算法刷题2

题目有一点水&#xff0c;不过还是有几个好题的&#xff0c;我在这分享一下&#xff1a; 很容易想到先往最高处跳再往最低处跳&#xff0c;依次类推&#xff0c;那怎么保证其正确性呢&#xff1f; 证法1. 在此&#xff0c;我们从0开始&#xff0c;假设可以跳到a,b,c(a<b<…

Linux中消息队列

消息队列 概念 消息队列是System V IPC对象的一种消息队列有消息队列ID来唯一标识消息队列就是一个消息列表。用户可以在消息队列中添加消息、读取信息等消息队列可以按照类型来发送/结束消息 消息队列使用步骤 打开/创建消息队列 msgget向消息队列发送信息 msgsnd从消息队…

4.4 MySQL存储

目录 1、使用前提 2、使用连接数据库最初步骤 2.1 最初步骤 2.2 connect()方法中参数简单传递 3、创建数据库(创建架构)和创建表 3.1 创建数据库(创建架构) 3.2 创建表 3.2.1 基本创建 3.2.2 创建自增主键 4、Pycharm 可视化连接 MySQL 图形界面 5、插入、更新、查询…

项目管理工具git

git 1. git介绍1.1. 版本控制系统 2. 创建本地版本库2.1 概念2.2 操作步骤 3. 修改文件4. 练习: 添加一个本地项目到仓库5. 添加远程仓库5.1 添加远程仓库5.2 本地仓库同步到远程仓库5.3 克隆远程仓库到本地5.4 SSH设置 6. 分支管理6.1 创建分支6.2 切换分支6.3 合并分支6.4 解…

基于yolov5的苹果检测(pytorch框架)【python源码+UI界面+功能源码详解】

功能演示&#xff1a; 基于yolov5的苹果检测系统&#xff0c;系统既能够实现图像检测&#xff0c;也可以进行视屏和摄像实时检测_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov5的苹果检测系统是在pytorch框架下实现的&#xff0c;这是一个完整的项目&#xf…

Go语言必知必会100问题-06 生产者端接口

生产者端接口 Go语言必知必会100问题-05 接口污染中介绍了程序中使用接口是有价值的。在编码的时候&#xff0c;接口应该放在哪里呢&#xff1f;这是Go开发人员经常有误解的一个问题&#xff0c;本文将深入分析该问题。 在深入探讨问题之前&#xff0c;先对提及的术语做一个定…

如何使用Inno Setup制作Unity构建程序的Windows安装程序

1. 准备 &#xff08;1&#xff09;准备好Unity构建的程序集合 必须包括&#xff1a; Data文件夹&#xff08;xxx_Data&#xff09; Mono文件夹&#xff08;MonoBleedingEdge&#xff09; 打包的应用程序文件&#xff08;xxx.exe&#xff09; Unity播放器dll文件&#xff…