管道:
无名管道:只能用于亲缘关系进程之间的通信:
有名管道:是一种特殊的文件,存在于内存中,在系统中有对应的名称,文件大小为0字节;
编程:
Linux系统中,有名管道通常通过mkfifo
命令或mkfifo()
系统调用来创建。一旦创建,有名管道就可以像普通文件一样被打开、读取和写入。
创建有名管道:
# 使用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将数据写入,并返回实际写入的字节数;
#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
是新的信号处理函数。如果func
是SIG_IGN
,则忽略该信号;如果func
是SIG_DFL
,则恢复该信号的默认处理行为。 - 注意:
signal()
的行为在不同的系统上可能有所不同,特别是在处理信号时。
SIGKILL,SIGSTOP两个信号不能被阻塞,处理和忽略;