学习记录第三十天

管道:

无名管道:只能用于亲缘关系进程之间的通信:

有名管道:是一种特殊的文件,存在于内存中,在系统中有对应的名称,文件大小为0字节;

编程:

Linux系统中,有名管道通常通过mkfifo命令或mkfifo()系统调用来创建。一旦创建,有名管道就可以像普通文件一样被打开、读取和写入。

创建有名管道:
cs 复制代码
# 使用mkfifo命令  
mkfifo /tmp/mypipe  
  
# 或者在C程序中  
#include <sys/types.h>  
#include <sys/stat.h>  
#include <fcntl.h>  
  
int main() {  
    mkfifo("/tmp/mypipe", 0666); // 创建有名管道,设置权限为666  
    return 0;  
}

参数说明:

pathname:管道名称的路径;

mode:FIFO的权限,和open是一样的;如0666;

返回值:成功返回0,失败返回-1,并设置对应的errno;

有名管道的注意事项

1、一个进程以只读打开管道会阻塞,直到另外一个进程以只写打开管道;

2、一个进程以只写打开管道会阻塞,直到另外一个进程以只读打开管道;

读管道:

管道中有数据,read返回实际读到的字节数;

管道中无数据:

管道写端被全部关闭,read返回0,相当于读到文件末尾;

写管道:

管道读端全部关闭,进程异常终止,收到信号SIGPIPE;

管道读端没有被全部关闭:

管道已经满了,write阻塞等待

管道没有满,write将数据写入,并返回实际写入的字节数;

cs 复制代码
#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  
#include <fcntl.h>  
#include <string.h>  
  
int main() {  
    int fd;  
    char buf[1024];  
  
    // 写进程  
    fd = open("/tmp/mypipe", O_WRONLY);  
    if (fd == -1) {  
        perror("open");  
        exit(NULL);  
    }  
    write(fd, "Hello, pipe!", 13);  
    close(fd);  
  
    // 读进程(在另一个程序中)  
    fd = open("/tmp/mypipe", O_RDONLY);  
    if (fd == -1) {  
        perror("open");  
        exit(NULL);  
    }  
    read(fd, buf, sizeof(buf) - 1);  
    buf[sizeof(buf) - 1] = '\0';  
    printf("Received: %s\n", buf);  
    close(fd);  
  
    return 0;  
}

信号:

本身并不能传递大量数据;信号被称为软中断(软件层面),软中断是操作系统中用于处理异步事件的一种机制,它通过软件方式模拟硬件中断的行为,使得系统能够在不直接打断当前进程执行的情况下,处理一些非紧急但耗时的任务。软中断的典型应用之一是"下半部"(bottom half)机制,即将硬件中断处理过程分为"上半部"和"下半部"两个阶段,其中"下半部"即为软中断处理的部分。

signal()

  • 原型:void (*signal(int sig, void (*func)(int)))(int);
  • 功能:设置信号的处理函数。sig是要处理的信号编号,func是新的信号处理函数。如果funcSIG_IGN,则忽略该信号;如果funcSIG_DFL,则恢复该信号的默认处理行为。
  • 注意:signal()的行为在不同的系统上可能有所不同,特别是在处理信号时。

SIGKILL,SIGSTOP两个信号不能被阻塞,处理和忽略;

相关推荐
西岸行者6 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意7 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码7 天前
嵌入式学习路线
学习
毛小茛7 天前
计算机系统概论——校验码
学习
babe小鑫7 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms7 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下7 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。7 天前
2026.2.25监控学习
学习
im_AMBER7 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J7 天前
从“Hello World“ 开始 C++
c语言·c++·学习