2024-2-23-进程线程的通信作业

news2025/1/16 10:55:48

1>信号代码

要求:

(1)

源代码:

#include <myhead.h>
void handler(int signo)
{
    if (signo == SIGINT)
    {
        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)

源代码:

#include <myhead.h>
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;
}

效果图:

(3)

源代码:

#include<myhead.h>

//定义信号处理函数
void handler(int signo)
{
    if(signo == SIGALRM)
    {
        printf("系统为你随机出了一张牌\n");

        alarm(5);
    }
}


int main(int argc, const char *argv[])
{


    //将SIGALRM信号进行捕获
    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;
}

效果图:

(4)

源代码:

#include <myhead.h>
void handler(int signo)
{
    if (signo == SIGUSR1)
    {
        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(getppid(), SIGUSR1);
        while (1)
        {
            printf("富贵险中求\n");
            sleep(1);
        }
    }
    else
    {
        perror("fork error");
        return -1;
    }

    return 0;
}

效果图

2>消息队列代码

要求:

源代码:

//msgsnd.c
#include <myhead.h>
struct msgbuf
{
    long mtype;
    char mtext[1024];
};
#define MAGSIZE 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;
    }

    int msqid = -1;
    if ((msqid = msgget(key, IPC_CREAT | 0664)) == -1)
    {
        perror("msgget error");
        return -1;
    }

    printf("ftok success key= %#x\n", key);
    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(msqid, &sbuf, MAGSIZE,0);
        printf("发送成功\n");

        if (strcmp(sbuf.mtext, "quit") == 0)
        {
            break;
        }
    }

    return 0;
}

//msgrcv.c
#include <myhead.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 msqid = -1;
    if ((msqid = msgget(key, IPC_CREAT | 0664)) == -1)
    {
        perror("msgget error");
        return -1;
    }

    struct msgbuf rbuf;
    while (1)
    {
        bzero(rbuf.mtext, sizeof(rbuf.mtext));
        msgrcv(msqid, &rbuf, MSGSIZE, 1, 0);
        printf("收到消息为:%s\n", rbuf.mtext);
        if (strcmp(rbuf.mtext, "quit") == 0)
        {
            break;
        }
    }
    if(msgctl(msqid,IPC_RMID,NULL)==-1)
    {
        perror("msgctl error");
        return -1;
    }
    

    return 0;
}

效果图:

3>

要求:

源代码:

//msgsnd.c
#include <myhead.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;
    }

    int msqid = -1;
    if ((msqid = msgget(key, IPC_CREAT | 0664)) == -1)
    {
        perror("msgget error");
        return -1;
    }

    printf("ftok success key= %#x\n", key);
    struct msgbuf sbuf_r;
    pid_t pid = fork();
    if (pid > 0)
    {

        while (1)
        {
            bzero(sbuf_r.mtext, sizeof(sbuf_r.mtext));
            printf("请输入当前消息的类型:\n");
            scanf("%ld", &sbuf_r.mtype);
            getchar();
            printf("请输入消息正文:\n");
            fgets(sbuf_r.mtext, sizeof(sbuf_r.mtext), stdin);
            sbuf_r.mtext[strlen(sbuf_r.mtext) - 1] = 0;
            msgsnd(msqid, &sbuf_r, MSGSIZE, 0);
            printf("发送成功\n");

            if (strcmp(sbuf_r.mtext, "quit") == 0)
            {
                break;
            }
        }

        // waitpid(0, NULL, WNOHANG);
        wait(NULL);
    }
    else if (pid == 0)
    {

        while (1)
        {
            bzero(sbuf_r.mtext, sizeof(sbuf_r.mtext));

            msgrcv(msqid, &sbuf_r, MSGSIZE, 2, 0);
            printf("收到消息为:%s\n", sbuf_r.mtext);
            if (strcmp(sbuf_r.mtext, "quit") == 0)
            {
                break;
            }
           }
        if (msgctl(msqid, IPC_RMID, NULL) == -1)
        {
            perror("msgctl error");
            return -1;
        }

        sleep(2);
        exit(EXIT_SUCCESS);
    }
    else
    {
        perror("fork error");
        return -1;
    }

    return 0;
}
//msgrcv.c
#include <myhead.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 msqid = -1;
    if ((msqid = msgget(key, IPC_CREAT | 0664)) == -1)
    {
        perror("msgget error");
        return -1;
    }

    struct msgbuf rbuf_s;
    pid_t pid = fork();
    if (pid > 0)
    {

        while (1)
        {
            bzero(rbuf_s.mtext, sizeof(rbuf_s.mtext));
            msgrcv(msqid, &rbuf_s, MSGSIZE, 1, 0);
            printf("收到消息为:%s\n", rbuf_s.mtext);
            if (strcmp(rbuf_s.mtext, "quit") == 0)
            {
                break;
            }
        }
        if (msgctl(msqid, IPC_RMID, NULL) == -1)
        {
            perror("msgctl error");
            return -1;
        }

        // waitpid(0,NULL,WNOHANG);
        wait(NULL);
    }
    else if (pid == 0)
    {

        while (1)
        {
            bzero(rbuf_s.mtext, sizeof(rbuf_s.mtext));

            printf("请输入当前消息的类型:\n");
            scanf("%ld", &rbuf_s.mtype);
            getchar();
            printf("请输入消息正文:\n");
            fgets(rbuf_s.mtext, sizeof(rbuf_s.mtext), stdin);
            rbuf_s.mtext[strlen(rbuf_s.mtext) - 1] = 0;

            msgsnd(msqid, &rbuf_s, MSGSIZE, 0);
            printf("发送成功\n");

            if (strcmp(rbuf_s.mtext, "quit") == 0)
            {
                break;
            }
        }

        exit(EXIT_SUCCESS);
    }
    else
    {
        perror("fork error");
        return -1;
    }

    return 0;
}

效果图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1470588.html

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

相关文章

AI论文速读 | 【综述】(LLM4TS)大语言模型用于时间序列

题目&#xff1a;Large Language Models for Time Series: A Survey 作者&#xff1a;Xiyuan Zhang , Ranak Roy Chowdhury , Rajesh K. Gupta and Jingbo Shang 机构&#xff1a;加州大学圣地亚哥分校&#xff08;UCSD&#xff09; 网址&#xff1a;https://arxiv.org/abs/…

istio系列教程

istio学习记录——安装https://suxueit.com/article_detail/otVbfI0BWZdDRfKqvP3Gistio学习记录——体验bookinfo及可视化观测https://suxueit.com/article_detail/o9VdfI0BWZdDRfKqlv0r istio学习记录——kiali介绍https://suxueit.com/article_detail/pNVbfY0BWZdDRfKqX_0K …

Gemini 模型将被引入Performance Max

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

计算机设计大赛 深度学习图像风格迁移 - opencv python

文章目录 0 前言1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习图像风格迁移 - opencv python 该项目较为新颖&#xff0c;适合作为竞赛课题…

Python爬虫进阶:爬取在线电视剧信息与高级检索

简介&#xff1a; 本文将向你展示如何使用Python创建一个能够爬取在线电视剧信息的爬虫&#xff0c;并介绍如何实现更高级的检索功能。我们将使用requests和BeautifulSoup库来爬取数据&#xff0c;并使用pandas库来处理和存储检索结果。 目录 一、爬取在线电视剧信息 …

顺序表知识点——顺序表的增删查改

目录 准备文件 创建顺序表蓝图 顺序表初始化函数接口 顺序表的销毁函数接口 顺序表的打印函数接口 顺序表的插入函数接口 顺序表的删除函数接口 从本节开始&#xff0c; 复习数据结构。 空间复杂度还有时间复杂度之后利用例题学习。 这节先学习顺序表的增删查改。 首…

【基于Ubuntu20.04的Autoware.universe安装过程】方案一:虚拟机 | 详细记录 | Vmware | 全过程图文 by.Akaxi

目录 一、Autoware.universe背景 二、虚拟机配置 三、Ubuntu20.04安装 四、GPU显卡安装 五、ROS2-Galactic安装 六、ROS2-dev-tools安装 七、rmw-implementation安装 八、pacmod安装 九、autoware-core安装 十、autoware universe dependencies安装 十一、安装pre-c…

JSONVUE

1.JSON学习 1.概念: JSON是把JS对象变成字符串. 2.作用: 多用于网络中数据传输. JavaScript对象 let person{name:"张三",age:18}//将JS对象转换为 JSON数据let person2JSON{"name":"张三","age":18}; 3.JS对象与JSON字符串转换…

力扣随笔删除有序数组中的重复项(简单26)

思路&#xff1a;根据类似于滑动窗口的思想&#xff0c;定义一个指针&#xff1b;使指针左边的区域全部为不重复元素&#xff08;包括指针所指的数字&#xff09; 以示例2为例&#xff0c;left&#xff1a;红色加粗 遍历指针i&#xff1a;黑色加粗 窗口范围&#xff0c;左边界到…

市场复盘总结 20240223

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率中 57% 最常用的…

检索增强生成(RAG) — 高级提示工程方法

Thread of Thought&#xff0c;ThoT Thread of Thought Unraveling Chaotic Contexts 大型语言模型&#xff08;LLMs&#xff09;在自然语言处理领域开启了一个变革的时代&#xff0c;在文本理解和生成任务上表现出色。然而&#xff0c;当面对混乱的上下文环境&#xff08;例…

Kotlin多线程

目录 线程的使用 线程的创建 例一&#xff1a;创建线程并输出Hello World Thread对象的用法 start() join() interrupt() 线程安全 原子性 可见性 有序性 线程锁 ReentrantLock ReadWriteLock 线程的使用 Java虚拟机中的多线程可以1:1映射至CPU中&#xff0c;即…

1298 - 摘花生问题

题目描述 Hello Kitty 想摘点花生送给她喜欢的米老鼠。她来到一片有网格状道路的矩形花生地(如下图)&#xff0c;从西北角进去&#xff0c;东南角出来。地里每个道路的交叉点上都有种着一株花生苗&#xff0c;上面有若干颗花生&#xff0c;经过一株花生苗就能摘走该它上面所有…

Git命令操作

什么是Git&#xff1f; Git是⼀个免费的&#xff0c;开源的分布式版本控制软件系统 git区域 存储区域&#xff1a;Git软件⽤于存储资源得区域。⼀般指得就是.git⽂件夹 ⼯作区域&#xff1a;Git软件对外提供资源得区域&#xff0c;此区域可⼈⼯对资源进⾏处理。 暂存区&am…

Mendix 开发实践指南|Mendix的核心概念

在当今快速变化的技术环境中&#xff0c;Mendix平台以模型驱动开发方法&#xff0c;重新定义了应用程序的构建过程。本章内容&#xff0c;将深入探讨Mendix的几大核心概念&#xff1a;模型驱动开发、微流、纳流 、 实体模型和页面&#xff0c;旨在帮助我们全面理解Mendix平台的…

蓝桥杯-顺子日期

解答加解析 #include<iostream> using namespace std; int main() { //日期分别是:2022.01.20~29 10天 //10.12 11.23 12.30 12.31 //总体思路就是123 012 其他组合不能出现 cout<<"14"; return 0; }

全志H713/H618方案:调焦电机(相励磁法步进电机)的驱动原理、适配方法

一、篇头 全志H713平台&#xff0c;作为FHD投影的低成本入门方案&#xff0c;其公板上也配齐了许多投影使用的模组&#xff0c;本文即介绍投影仪调焦所用的步进电机&#xff0c;此模组的驱动原理、配制方法、调试方法。因为条件限制&#xff0c;本文采用的是H618香橙派Z3平台&…

模仿蜘蛛工作原理 苏黎世联邦理工学院研发牛油果机器人可在雨林树冠穿行

对于野外环境生物监测的研究人员来讲&#xff0c;收集生物多样性数据已成为日常工作重要组成部分&#xff0c;特别是对于热带雨林的茂密树冠当中活跃着非常多的动物、昆虫与植物。每次勘察都需要研究人员爬上茂密树冠收集数据&#xff0c;一方面增加了数据收集难度&#xff0c;…

Unity(第五部)新手图层和标签的理解

1、标记用于在物体上显示名字&#xff0c;方便开发 2、标签&#xff08;某一类物体&#xff0c;方便给某一类进行组件脚本编写&#xff09; 而且有了标签之后&#xff0c;我们在写代码的时候就可以直接通过标签找到一系列我们需要的游戏物体了 Untagged未标记Respawn重生Edi…

【hashmap】【将排序之后的字符串作为哈希表的键】【获取 HashMap 中所有值的集合】Leetcode 49 字母异位词分组

【hashmap】【将排序之后的字符串作为哈希表的键】【获取 HashMap 中所有值的集合】Leetcode 49 字母异位词分组 解法1 将排序之后的字符串作为哈希表的键解法2 在解法一的基础上加入了getOrDefault ---------------&#x1f388;&#x1f388;题目链接&#x1f388;&#x1f3…