Linux:
是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。它主要用于基于Intel x86系列CPU的计算机上。这个系统是由全世界各地的成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。
一、管道
管道,分为无名管道和有名管道,是 UNIX 系统IPC最古老的形式,是进程间通讯的一种
1、无名管道特点:
它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。
它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。
它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。
创建无名管道函数和所需头文件
#include <unistd.h>
int pipe(int fd[2]);
其函数返回值失败为-1,成功为0
当无名管道建立成功时会创建两个文件描述符f[0] 、 f[1],并且创建成功的管道相当于一个队列,先进先出,有读端和写端
f【0】代表读端
f【1】代表写端
在通讯过程中写端会传入数据读端会读出数据
读阻塞:如果在管道中没有数据而运行read时,便会读阻塞
写阻塞:如果写的内容的大小大于管道大小,便会写阻塞
我们先来看一下在一个进程里的实现
在该进程中我们先写入数据在读数据,无名管道在读数据之后管道内入队的数据就会被出队(因为管道相当于一个队列)
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int fd[2];
int r = pipe(fd);
if(r == -1)
{
printf("creat pipe fail\n");
return r;
}
else
{
printf("creat pipe success\n");
}
char write_buff[] = "hello world!";
char read_buff[128] = {0};
write(fd[1],write_buff,sizeof(write_buff));
read(fd[0],read_buff,127);
printf("%s\n",read_buff);
close(fd[0]);
close(fd[1]);
return 0;
}
无名管道实现的进程间通讯只能父子进程间通讯
如
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
int main()
{
int fd[2];
int r = pipe(fd);
if(r == -1)
{
printf("creat pipe fail\n");
return r;
}
else
{
printf("creat pipe success\n");
}
pid_t pid = fork();
assert(pid!=-1);
if(pid == -1)
{
printf("creat fork fail\n");
return pid;
}
if(pid == 0)
{
char w_buff[] = "hello world!";
write(fd[1],w_buff,sizeof(w_buff));
close(fd[1]);
}
else
{
char r_buff[128] = {0};
read(fd[0],r_buff,127);
printf("r_buff = %s\n",r_buff);
close(fd[0]);
}
return 0;
}