学习记录第三十天

管道:

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

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

编程:

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

创建有名管道:
# 使用mkfifo命令  
mkfifo /tmp/mypipe  
  
# 或者在C程序中  
#include   
#include   
#include   
  
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将数据写入,并返回实际写入的字节数;

#include   
#include   
#include   
#include   
#include   
  
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)机制,即将硬件中断处理过程分为“上半部”和“下半部”两个阶段,其中“下半部”即为软中断处理的部分。

学习记录第三十天_第1张图片 

signal()

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

学习记录第三十天_第2张图片

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

你可能感兴趣的:(学习)