进程间通讯(2)---管道

本文详细介绍了管道通信的概念,包括半双工通讯的特点、数据流向及有名管道(fifo)和无名管道(pipe)的区别。有名管道可在任意两个进程间通信,通过mkfifo()函数创建;无名管道通常用于父子进程间通信,通过pipe()系统调用创建。

管道:半双工通讯

数据流向是单向的、先进先出的。只能一个进程读、一个进程写。数据从管道中读出后,就会被删除。如果管道中没有数据,读操作就会被阻塞,直到管道中有数据可读;而如果管道的满的,写操作就会被阻塞,直到管道中有足够大的空间可用。

 

有名管道(fifo):在任意两个进程间通信。有属性信息、inode结点存在磁盘上。

在文件目录树中存在管道文件标识。但是管道文件不占据磁盘空间,需要传递的数据缓存在内存区域。

通过mknode() 系统调用或mkfifo()函数来建立。因为Linux系统为每一个文件都提供了访问权限,所以只要两个进程都有操作FIFO的权限,就能通过文件名将其打开、进行读写。FIFO在内存中释放,但磁盘结点仍然存在。可以通过unlink函数删除管道。

无名管道(pipe):用于父子进程之间。无属性信息,没有inode结点。通过pipe()系统调用创建并打开,当最后使用它的进程关闭对它的引用时,pipe自动撤销。

 

通信过程:(依然是文件操作那一套):管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在于内存中。

管道的实质是内核缓冲区,有名管道和无名管道都是通过内核缓冲区实现数据传输。

 

     

 

创建有名管道文件  & 有名管道的使用:

(命令)mkfifo 文件名

(函数)int mkfifo(const char *pathname, mode_t mode)

第一个参数将要在文件系统中创建一个专用文件,第二个参数来规定FIFO的读写权限,不能用open创建一个管道文件。

/*
 *写端
*/
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<errno.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>

#define FIFO "myfifo"

int main()
{
	int fd;
	char buff[128] = {0};
	int n;

	//打开管道
	fd = open(FIFO,O_WRONLY);

	fgets(buff,127,stdin);
	buff[strlen(buff) -1] == 0;

	//向管道中写入数据
	n = write(fd,buff,strlen(buff));

	close(fd);

}

	
/*
 *读端
*/
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>


#define FIFO "myfifo"

int main()
{
	int fd;
	char buff[128] = {0};
	int n;

	//创建管道
	if((mkfifo(FIFO, 0664)<0) && errno != EEXIST)
	{
		printf("创建管道失败");
	}
	//打开管道
	fd = open(FIFO,O_RDONLY);
	if(fd == -1)
	{
		perror("open");
		exit(1);
	}
	//读取数据
	n = read(fd,buff,127);	
	printf("从管道中读出的数据:%s\n",buff);

	close(fd);
	unlink(FIFO);
}

有名管道文件的操作:

              创建:int mkfifo(const char *pathname, mode_t mode)

              打开:int open(char *path,int flag)

              读:int read( int fd, void *buff, size_t size)

              写:int write( int fd, void *buff, size_t size)

              关闭:int close( int fd )

              删除:int unlink(const char *pathname)

 

       一旦创建了一个FIFO,就可用open打开它,但使用mkfifo函数创建管道时,注意在哪个进程源文件中创建管道,就要先运行哪个进程,否则,另一个进程会因为管道不存在而无法打开管道。

 

创建无名管道 & 无名管道的使用:

  int pipe(int filedis[2]);   0端用于读管道,1端用于写管道

#include<stdio.h>
#include<unsiatd.h>
#include<string.h>

int main()
{
	pid_t fd;
	char buff[1024] = {0};
	int pipe_fd[2]; //有名管道的文件描述符
	
	if(pipe(pipe_fd) < 0)   //创建有名管道
	{
		printf("创建管道失败");
		return 0;
	}
	
	fd = fork();  //fork一个子进程
	if(fd == 0)   //在子进程中
	{
		close(pipe_fd[1]);   //关闭管道的写端
		if( (n = read(pipe_fd[0],buff,1024))  > 0 )
		{
			printf("子进程从管道中读取的数据:%s\n",buff);  
		}
		close(pipe_fd[0]);
		exit(0);
	}
	else if(fd > 0 )  //在父进程中
	{
		close(pipe_fd[0]);
		write(pipe_fd[1],"hello my son!",13);  //相关到中写入数据
		close(pipe_fd[1]);
		
		sleep(2);
		wait(fd);  //调用wait等待子进程结束
		exit(0);
	}
}

   无名管道的操作:

              创建管道:int pipe(int pipefd[2])

              读:int read( int fd, void *buff, size_t size)

              写:int write( int fd, void *buff, size_t size)

              关闭:int close( int fd )

【永磁同步电机】基于模型预测控制MPC的永磁同步电机非线性终端滑模控制仿真研究(Simulink&Matlab代码实现)内容概要:本文围绕永磁同步电机(PMSM)的高性能控制展开,提出了一种结合模型预测控制(MPC)与非线性终端滑模控制(NTSMC)的先进控制策略,并通过Simulink与Matlab进行系统建模与仿真验证。该方法旨在克服传统控制中动态响应慢、鲁棒性不足等问题,利用MPC的多步预测和滚动优化能力,结合NTSMC的强鲁棒性和有限时间收敛特性,实现对电机转速和电流的高精度、快速响应控制。文中详细阐述了系统数学模型构建、控制器设计流程、参数整定方法及仿真结果分析,展示了该复合控制策略在抗干扰能力和动态性能方面的优越性。; 适合人群:具备自动控制理论、电机控制基础知识及一定Matlab/Simulink仿真能力的电气工程、自动化等相关专业的研究生、科研人员及从事电机驱动系统开发的工程师。; 使用场景及目标:①用于深入理解模型预测控制与滑模控制在电机系统中的融合应用;②为永磁同步电机高性能控制系统的仿真研究与实际设计提供可复现的技术方案与代码参考;③支撑科研论文复现、课题研究或工程项目前期验证。; 阅读建议:建议读者结合提供的Simulink模型与Matlab代码,逐步调试仿真环境,重点分析控制器设计逻辑与参数敏感性,同时可尝试在此基础上引入外部扰动或参数变化以进一步验证控制鲁棒性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值