系统相关
首页 > 系统相关> > 126-Linux进程间通信(IPC)机制

126-Linux进程间通信(IPC)机制

作者:互联网

进程间通信(IPC)的方式有哪些:
1.管道:有名管道,无名管道
2.信号量
3.共享内存
4.消息队列
5.套接字

每个进程是一个独立的个体

将a进程的数据拷贝到b进程的数据,可以通过设置一个文件作为中间文件,将a进程的数据写到文件中,再把文件中的数据读到b中,但是这种方法不太好,因为文件是在磁盘中存储的,I/O速度较慢,所以系统采用的方式不是这种

ps -ef | grep “bash”:中的 | 就是一个管道,grep是过滤的意思,只过滤有有"bash"内容的数据

mkfifo a:mkfifo是创建管道的命令,a是名字

注意:管道不能持久的存储数据

管道文件和文件不一样的地方:
1.两个进程必须同时打开,必须是一读一写才可以
2.用open打开管道,如果只有一个人打开open,那么就会阻塞
3.写入数据write 数据实际写到了内存中,而不是磁盘上,管道也是有大小的,如果管道满了,继续往里面写的话就会读阻塞
4.读管道 read 读是从内存中读,如果管道的数据为空,就会读阻塞
5.关闭管道close

演示通过有名管道让两个进程通讯

a.c的代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <signal.h>

void fun(int sig)
{
    printf("sig=%d\n",sig);
}

int main()
{
    signal(SIGPIPE,fun);
    int fd = open("fifo",O_WRONLY);
    printf("fd=%d\n",fd);

    while(1)
    {
        printf("input:\n");
        char buff[128] = {0};
        fgets(buff,128,stdin);
        if(strncmp(buff,"end",3) == 0)
        {
            break;
        }
        write(fd,buff,strlen(buff));
    }
    close(fd);
}

b.c的代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>

int main()
{
    int fd = open("fifo",O_RDONLY);
    printf("fd=%d\n",fd);

    while(1)
    {
        char buff[128] = {0};
        int n = read(fd,buff,127);
        if(n == 0)
        {
            break;
        }
        printf("n=%d,buff=%s\n",n,buff);
    }
    close(fd);
    exit(0);
}

先运行a.c再运行b.c

先运行b.c再运行a.c

先终止b.c(读端),那么a.c(写端)会怎么样:进程会收到一个信号(13号信号SIGPIPE),将程序终止
代码:

管道是怎么存储数据的?
管道打开时会在内存中分配一块空间(划分成一个字节一个字节的),会有两个指针(头指针和尾指针,一开始都指向起始位置),当数据写入的时候,头指针会往后挪动(头指针始终指向要即将写入的地方),两个指针之间的距离就是数据的长度,当要读数据的时候,如果要读的内容小于两个指针的距离就可以读,读的时候尾指针往后挪,如果尾指针读读到头指针的位置了,说明管道读空了(所以管道空的时候,两个指针不一定在起始位置),如果写到管道最后了,就会从头开始继续写,如果写到尾指针的位置了,说明写满了,此时就不能继续写了

无名管道
无名管道相对来说容易一些

无名只能在父子进程间通信

无名管道:用pipe(int fd[])创建,一般来说,fd[0]是读端,fd[1]是写端

面试会问到的问题:
1.有名管道和无名管道的区别?
有名管道可以在任一两个进程间通信,无名管道只能用在父子进程
2.写入管道的数据存储在哪里?内存还是磁盘?
在内存中存储
3.管道的通讯方式是全双工还是半双工?
是半双工

什么是全双工、半双工、双工?
全双工(能同时发同时收):如打电话,既能说话也能听间别人说话

半双工(能发也能收,但是不能同时发同时收):如对讲机,能发也能收,但是不能同时发同时收

单工(只能收不能发):如收音机,数据流向是单项的,数据只能从一方流向另一方,而不能逆向流动

管道写端关闭,读端read的返回值等于0

管道读端关闭,写端write异常SIGPIPE

dup():复制文件描述符(文件描述符是文件表的下标),返回值就是新的描述符

dup2():????

文件描述符是文件表的下标,标准输入(0),标准输出(1),标准错误输出(2)

下一次课的内容:
查一下概念
信号量:
1.什么是信号量?
2.(面试)pv操作是什么?
3.临界区?
4.临界资源?
5.原子操作?

标签:IPC,buff,int,间通信,管道,fd,126,include,指针
来源: https://blog.csdn.net/weixin_45964837/article/details/121705321