学习记录第三十天

管道:

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

有名管道:是一种特殊的文件,存在于内存中,在系统中有对应的名称,文件大小为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两个信号不能被阻塞,处理和忽略;

相关推荐
架构文摘JGWZ44 分钟前
FastJson很快,有什么用?
后端·学习
量子-Alex3 小时前
【多视图学习】显式视图-标签问题:多视图聚类的多方面互补性研究
学习
乔木剑衣3 小时前
Java集合学习:HashMap的原理
java·学习·哈希算法·集合
练小杰4 小时前
Linux系统 C/C++编程基础——基于Qt的图形用户界面编程
linux·c语言·c++·经验分享·qt·学习·编辑器
皮肤科大白4 小时前
如何在data.table中处理缺失值
学习·算法·机器学习
皮肤科大白4 小时前
“““【运用 R 语言里的“predict”函数针对 Cox 模型展开新数据的预测以及推理。】“““
学习
汤姆和佩琦5 小时前
2025-1-21-sklearn学习(43) 使用 scikit-learn 介绍机器学习 楼上阑干横斗柄,寒露人远鸡相应。
人工智能·python·学习·机器学习·scikit-learn·sklearn
qq_544329175 小时前
下载一个项目到跑通的大致过程是什么?
javascript·学习·bug
Ronin-Lotus7 小时前
上位机知识篇---ROS2命令行命令&静态链接库&动态链接库
学习·程序人生·机器人·bash
Kasper01218 小时前
认识Django项目模版文件——Django学习日志(二)
学习·django