创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡><)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
Linux系列专栏:Linux基础给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ
进程间通信是操作系统提供的一种机制,用于多个进程之间进行数据通信,实现资源协调与共享。
IPC:Interprocess Communication 进程间通信
例如在单任务处理器中,多个进程之间就依靠着进程间通信 调度CPU,使得多个进程高效率并发执行
Linux中进程间通信的方式:
匿名管道用于具有亲缘关系的进程之间的通信,无法与其他进程进行通信。
在管道使用前需要先确定数据传输的方向,只能用于单向通信,即数据只能从一端写入,从另一端读取。
调用pipe(int fd[2])函数后,进程将会在内核层创建一个管道缓冲区(环形队列),当管道被创建成功后,将会传出两个文件描述符:fd[0]为读取,fd[1]为写入文件描述符。
由于子进程会继承父进程的文件描述符表,父进程和子进程可以分别获得一个文件描述符,父子进程间传输数据就依靠这两个文件描述符。
使用举例:
#include
#include
#include
#include
int main()
{
pid_t pid;
int fd[2]; //读取和写入文件描述符号
pipe(fd);
pid = fork();
if(pid > 0) //父进程
{
close(fd[0]); //确定通信方向:关闭读端
char* str = "TianXiStudio";
write(fd[1],str,strlen(str));
close(fd[1]); //写入完成,关闭写入文件描述符
wait(NULL); //回收僵尸进程
exit(0);
}
else if(pid == 0) //子进程
{
close(fd[1]); //确定通信方向:关闭写端
char buf[1024];
bzero(buf,sizeof(buf));
read(fd[0],buf,sizeof(buf)); //从管道中读取数据
printf("read:%s\n",buf);
close(fd[0]); //读取完成,关闭读取文件描述符
exit(0);
}
else
{
perror("fork failed");
exit(0);
}
return 0;
}
有名管道是一种特殊的文件类型,存在于文件系统中,但并不是用于存储数据的,而是用于进程间通信。
相比于匿名管道的亲缘间通信,有名管道可以支持非亲缘关系之间的通信
使用命令mkfifo或函数mkfifo()来创建管道文件,两个进程间通过打开管道文件后使用read()
函数读取或write()
写入,进行通信。
管道文件本身不能存储,通过重定向到管道缓冲区中,对管道文件读写就会对管道缓冲区进行读写当进程不再需要使用管道时,应关闭管道文件描述符。
写入进程:
#include
#include
#include
#include
int main()
{
int fd = open("fifo",O_WRONLY);
char* str = "TianXiStudio";
write(fd,str,strlen(str));
close(fd);
return 0;
}
读取进程:
#include
#include
#include
#include
int main()
{
int fd = open("fifo",O_RDONLY);
char buffer[1024*4];
read(fd,buffer,sizeof(buffer));
printf("read :%s\n",buffer);
close(fd);
return 0;
}
大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。 |
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●) |