20211105李宜时信息安全系统设计与实现学习笔记9

发布时间 2023-11-12 15:02:18作者: 李宜时

信号和信号处理包括信号和中断

1. 信号和中断的基础

  • 定义和概述:解释信号在操作系统中的作用,它们如何与中断相关。
  • 信号类型:列出常见的 UNIX/Linux 信号,例如 SIGINT, SIGTERM, SIGKILL 等。

2. UNIX/Linux 信号示例

  • 实例演示:通过实际示例展示信号如何工作。
  • 代码段:提供简单的代码示例来演示如何生成和响应信号。

3. UNIX/Linux 中的信号处理

  • 信号的来源:解释信号是如何生成的,例如用户输入、系统事件等。
  • 进程 proc 结构体中的信号:讨论进程控制块(PCB)中与信号相关的部分。
  • 信号处理函数:介绍如何编写和使用信号处理函数。
  • 安装信号捕捉函数:演示如何安装和使用信号处理程序。

4. 信号处理步骤

  • 详细步骤:逐步介绍在接收到信号时操作系统和应用程序需要执行的操作。

5. 信号与 IPC

  • 信号用作 IPC:探讨信号如何在进程间通信(IPC)中使用。
  • Linux 中的 IPC 方法:比较管道和 FIFO、System V IPC、POSIX 消息队列等不同的 IPC 机制。
  • 线程同步机制:讨论线程间同步的方法,如互斥锁、条件变量等。
  • 套接字:解释如何使用套接字进行进程间通信。

6. 编程项目:实现一个消息 IPC

  • 项目要求:详细描述项目的目标和要求。
  • 实现步骤:分步指导如何实现该项目。
  • 代码示例:提供参考代码,帮助理解和实现。

7. 格式化和样式

  • Markdown 格式:使用 Markdown 语法来格式化笔记,例如使用标题、列表、代码块等。
  • 代码实践:确保提供足够的代码实例和实践练习。

这个结构不仅会帮助你更好地理解和组织学习内容,还可以使你的笔记更加清晰和有用。记得在编写过程中不断实践和测试代码示例,这对深入理解这些概念非常重要。

当然,我还做了一些操作和代码

1. 信号和中断的基础

信号是 UNIX 和 Linux 系统中进程间通信的一种方式。它们用于通知进程某个事件已发生。例如,SIGKILL 用于强制终止进程,SIGTERM 用于请求进程终止,SIGINT 则通常由 Ctrl+C 触发,用于中断进程。

2. UNIX/Linux 信号示例

让我们看一个简单的信号处理示例。下面的 C 代码展示了如何捕捉和处理 SIGINT 信号:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void signal_handler(int signal) {
    printf("捕捉到 SIGINT 信号\n");
}

int main() {
    signal(SIGINT, signal_handler);
    while(1) {
        printf("等待信号...\n");
        sleep(1);
    }
    return 0;
}

在这个程序中,我们定义了一个信号处理函数 signal_handler,当捕捉到 SIGINT 信号时,它会打印一条消息。主函数中,我们通过 signal() 函数将 SIGINT 信号与 signal_handler 函数关联起来。

3. UNIX/Linux 中的信号处理

信号可以由操作系统、用户或其他程序产生。进程可以定义自己的信号处理函数,或者使用默认的处理方式。例如,在 C 语言中,你可以使用 sigaction 函数来更精确地控制信号的处理:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void sigint_handler(int sig) {
    write(STDOUT_FILENO, "处理 SIGINT 信号\n", 17);
}

int main() {
    struct sigaction sa;
    sa.sa_handler = sigint_handler;
    sa.sa_flags = 0; // 或者使用 SA_RESTART
    sigemptyset(&sa.sa_mask);

    sigaction(SIGINT, &sa, NULL);

    while(1) {
        sleep(1);
    }
    return 0;
}

4. 信号处理步骤

当信号发送到进程时,操作系统暂停进程当前的活动,执行相应的信号处理函数。处理完成后,进程继续执行。

5. 信号与 IPC

在 Linux 中,信号也可以用作简单的进程间通信(IPC)。尽管它们不适合传输复杂的数据,但可以用来通知其他进程某个事件的发生。

除了信号,Linux 支持多种 IPC 机制,如管道(pipe)、命名管道(FIFO)、共享内存、信号量等。

6. 编程项目:实现一个消息 IPC

这个项目可以是创建一个简单的聊天程序,使用 POSIX 消息队列进行通信。每个进程可以发送消息到队列,并从队列接收消息。

这里是一个简单的 POSIX 消息队列示例代码片段:

#include <fcntl.h>           
#include <sys/stat.h>        
#include <mqueue.h>

int main() {
    mqd_t mq;
    struct mq_attr attr;
    char buffer[1024 + 1];
    int must_stop = 0;

    /* 设置消息队列属性 */
    attr.mq_flags = 0;
    attr.mq_maxmsg = 10;
    attr.mq_msgsize = 1024;
    attr.mq_curmsgs = 0;

    /* 创建并打开消息队列 */
    mq = mq_open("/test_queue", O_CREAT | O_RDONLY, 0644, &attr);

    do {
        ssize_t bytes_read;

        /* 接收消息 */
        bytes_read = mq_receive(mq, buffer, 1024, NULL);
        buffer[bytes_read] = '\0';
        if (!strncmp(buffer, "exit", 4)) {
            must_stop = 1;
        } else {
            printf("接收到的消息: %s\n", buffer);
        }
    } while (!must_stop);

    /* 关闭和删除消息队列


![](https://img2023.cnblogs.com/blog/2778425/202311/2778425-20231112145809186-2055295057.png)
![](https://img2023.cnblogs.com/blog/2778425/202311/2778425-20231112145819282-143757281.png)
![](https://img2023.cnblogs.com/blog/2778425/202311/2778425-20231112145823684-854905790.png)
![](https://img2023.cnblogs.com/blog/2778425/202311/2778425-20231112145827781-1064053674.png)
![](https://img2023.cnblogs.com/blog/2778425/202311/2778425-20231112145832395-1416436939.png)
![](https://img2023.cnblogs.com/blog/2778425/202311/2778425-20231112145836633-1284448628.png)
![](https://img2023.cnblogs.com/blog/2778425/202311/2778425-20231112145840901-1684781644.png)
![](https://img2023.cnblogs.com/blog/2778425/202311/2778425-20231112145848793-164338470.png)
![](https://img2023.cnblogs.com/blog/2778425/202311/2778425-20231112145852572-2064934342.png)
![](https://img2023.cnblogs.com/blog/2778425/202311/2778425-20231112145909272-1271830280.png)
![](https://img2023.cnblogs.com/blog/2778425/202311/2778425-20231112145917550-2047351553.png)