linux下编程——操作系统——管道通信(代码片段)

可爱小夫 可爱小夫     2022-12-25     783

关键词:

相关知识:

1、有名管道

一个可以在文件系统中长期存在的、具有路径名的文件。用系统调用mknod( )建立。它克服无名管道使用上的局限性,可让更多的进程也能利用管道进行通信。因而其它进程可以知道它的存在,并能利用路径名来访问该文件。对有名管道的访问方式与访问其他文件一样,需先用open( )打开。

2、无名管道

一个临时文件。利用pipe( )建立起来的无名文件(无路径名)。只用该系统调用所返回的文件描述符来标识该文件,故只有调用pipe( )的进程及其子孙进程才能识别此文件描述符,才能利用该文件(管道)进行通信。当这些进程不再使用此管道时,核心收回其索引结点。

3pipe文件的建立

分配磁盘和内存索引结点、为读进程分配文件表项、为写进程分配文件表项、分配用户文件描述符

4、读/写进程互斥

内核为地址设置一个读指针和一个写指针,按先进先出顺序读、写。

为使读、写进程互斥地访问pipe文件,需使各进程互斥地访问pipe文件索引结点中的直接地址项。因此,每次进程在访问pipe文件前,都需检查该索引文件是否已被上锁。若是,进程便睡眠等待,否则,将其上锁,进行读/写。操作结束后解锁,并唤醒因该索引结点上锁而睡眠的进程。

 

 

1pipe( )

 

建立一无名管道。

 

系统调用格式

 

              pipe(filedes)

 

参数定义

 

int  pipe(filedes);

 

int  filedes[2];

 

其中,filedes[1]是写入端,filedes[0]是读出端。

 

该函数使用头文件如下:

 

#include <unistd.h>

 

#inlcude <signal.h>

 

#include <stdio.h>

 

   2read( )

 

  系统调用格式

 

                  read(fd,buf,nbyte)

 

  功能:从fd所指示的文件中读出nbyte个字节的数据,并将它们送至由指针buf所指示的缓冲区中。如该文件被加锁,等待,直到锁打开为止。

 

  参数定义

 

                  int  read(fd,buf,nbyte);

 

                  int  fd;

 

                  char *buf;

 

                  unsigned  nbyte;

 

  3write( )

 

系统调用格式

 

                  read(fd,buf,nbyte)

 

功能:把nbyte 个字节的数据,从buf所指向的缓冲区写到由fd所指向的文件中。如文件加锁,暂停写入,直至开锁。

 

参数定义同read( )。

 

无名管道程序源码:

#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
int pid1,pid2;
 
int main()
 
    int fd[2];
    char outpipe[100],inpipe[100];
    pipe(fd);                       /*创建一个管道*/
    while ((pid1=fork()) == -1);
    if(pid1 == 0)
    
        lockf(fd[1],1,0);
        sprintf(outpipe,"I am a child 1 "); 
        /*把串放入数组outpipe中*/
        write(fd[1],outpipe,50);     /*向管道写长为50字节的串*/
        sleep(1);                 /*自我阻塞5秒*/
        lockf(fd[1],0,0);
        exit(0);
    
    else
    
        sleep(1);//延时等待子进程1结束
        while((pid2=fork()) == -1);
        if(pid2 == 0)
            
            
            lockf(fd[1],1,0);           /*互斥*/
               sprintf(outpipe,"I am a child 2 ");
                write(fd[1],outpipe,50);
                sleep(1);
               lockf(fd[1],0,0);
                exit(0);
        
        else
        
            wait(0);              /*同步*/
             read(fd[0],inpipe,50);   /*从管道中读长为50字节的串*/
                printf("%s\n",inpipe);
             wait(0);
             read(fd[0],inpipe,50);
             printf("%s\n",inpipe);
                exit(0);
        
    

有名管道程序源码:

#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#include <signal.h>
int pid1,pid2;

int main()

    char *filename = "fifo";
    int res = mkfifo(filename,0666);//创建文件
    if(res < 0)
    
        perror("mkfifo error");
        return -1;
    

    int fd = open(filename,O_RDWR);//打开文件
    if(fd < 0)
    
        perror("open error");
        return -2;
    

    while((pid1=fork()) == -1);//创建子进程1
    if(pid1 == 0)
    
        char *str1 = "I am a child 1";
        int len1 = write(fd,str1,strlen(str1));
    
    else
    
        sleep(1);//等待子进程1结束
        while((pid2=fork()) == -1);
        if(pid2 == 0)
        
            char *str2 = "   I am a child 2";
            int len2 = write(fd,str2,strlen(str2));
        
        else 
        
            wait(0);
            wait(0);
            int len;
            char buf[128] = 0;
            len = read(fd,buf,sizeof(buf) - 1);
            printf("%s\n",buf);

        
    
    
    close(fd);
    unlink(filename);

 

linux系统编程—进程间的通信(代码片段)

...erProcessCommunication)。在进程间完成数据传递需要借助操作系统提供特殊的方法,如:文件、管道、信号、共享内存、消息队列、套接字、命名管道等。随着计算机的蓬勃发展ÿ 查看详情

c++笔记--linux编程(11)-进程通信(代码片段)

无名管道无名管道        无名管道是半双工的,就是对于一个管道来讲,只能读,或者写。        无名管道只能在相关的、有共同祖先的进程间使用。        一个fork或者exec调用创建的子进程继承了父... 查看详情

linuxsocket编程(代码片段)

整体大纲一、套接字概念  Socket本身有“插座”的意思,在Linux环境下,用于表示进程间网络通信的特殊文件类型。本质为内核借助缓冲区形成的伪文件。  既然是文件,那么理所当然的,我们可以使用文件... 查看详情

linux进程和进程通信编程(代码片段)

...是因为在它的某个角落隐藏着一口井.linux进程和进程通信编程(2)进程间通信1.管道通信(1)有名管道mkfifo21write.c,21read.c代码(2)无名管道20.c代码2.信号通信(1)信号发送raise22.1.c代码kill22-2.cÿ... 查看详情

python并发编程—进程间通信(代码片段)

进程间通信(IPC) 1.必要性:进程间空间独立,资源不共享,此时在需要进程间数据传输时就需要特定的手段进行数据通信。  2.常用进程间通信方法:管道通信、消息队列、共享内存、信号量 管道通信(Pipe)1.通信... 查看详情

一文让你透彻理解linux的socket编程(含实例解析)(代码片段)

...个相互通信的进程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如UNIXBSD有:管道(pipe)、命名管道(namedpipe)软中断信号(sign 查看详情

linux学习进程间通信——匿名管道|命名管道(代码片段)

...代码就切换在VScode上写了,总算告别VIM了,而且编程语言也开始使用C++了。进程间通信——匿名管道|命名管道🌞进程间通信🌞管道⭐匿名管道建立管道的系统调用pipe通信代码及演示匿名管道的读写特征⭐... 查看详情

小鸟初学shell编程管道符(代码片段)

...相之间可以相互通信。管道符管道符(匿名管道)是Shell编程经常用到的通信工具。管道符是"|",主要是把两个应用程序连接在一起,然后把第一个应用程序的输出,作为第二个应用程序的输入。如果还有第三个应用程序... 查看详情

linux操作系统进程间通信(代码片段)

文章目录1.进程间通信介绍1.1进程间通信的目的1.2进程间通信的发展1.3进程间通信分类2.管道2.1匿名管道2.2命名管道3.SystemV3.1共享内存①shmget②shmctl③shmat④shmdt⑤申请共享内存大小的问题⑥structshmid_ds3.2信号量1.进程间通信介绍进... 查看详情

linux操作系统进程间通信(代码片段)

文章目录1.进程间通信介绍1.1进程间通信的目的1.2进程间通信的发展1.3进程间通信分类2.管道2.1匿名管道2.2命名管道3.SystemV3.1共享内存①shmget②shmctl③shmat④shmdt⑤申请共享内存大小的问题⑥structshmid_ds3.2信号量1.进程间通信介绍进... 查看详情

多进程编程之进程间通信-管道和消息队列

1.进程间通信Linux作为一种新兴的操作系统,几乎支持所有的Unix下常用的进程间通信方法:管道、消息队列、共享内存、信号量、套接口等等。2.2.1管道管道是进程间通信中最古老的方式,它包括无名管道和有名管道两种,前者... 查看详情

进程间的五种通信方式介绍(代码片段)

...et和Streams支持不同主机上的两个进程IPC。以Linux中的C语言编程为例。一、管道管道,通常指无名管道,是UNIX系统IPC最 查看详情

linux进程间通信(代码片段)

...念进程间通信的目的进程间通信的本质进程间通信的分类管道什么是管道匿名管道匿名管道的原理pipe函数匿名管道使用步骤管道读写规则管道的特点管道的四种特殊情况管道的大小命名管道命名管道的原理使用命令创建命名管... 查看详情

linux篇第十一篇——进程间通信(管道+systemv共享内存)(代码片段)

...的一些知识。Linux下进程通信常见的几种方式,例如管道、共享内存等。目录🌏介绍🌏管道🌲认识管道🌲匿名管道🍯创建匿名管道——pipe🍯管道的本质🍯使用匿名管道进行通信🍯匿名管道... 查看详情

进程间的五种通信方式介绍(代码片段)

...et和Streams支持不同主机上的两个进程IPC。以Linux中的C语言编程为例。一、管道管道,通常指无名管道,是UNIX系统IPC最古老的形式。1、特点:它是半双工的( 查看详情

[linux]进程间通信(代码片段)

文章目录1进程间通信1.1通信方式1.1.1管道1.1.1.1匿名管道1.1.1.2命名管道1.1.2SystemV1.2信号量结尾1进程间通信进程间通信的本质:让进程看到同一块空间,俩进程对这一块内存进行读写。其通信的作用就是传输数据,资源... 查看详情

linux入门进程间的通信(代码片段)

...通信介绍进程间通信目的进程间通信发展进程间通信分类管道什么是管道匿名管道用fork来共享管道的原理站在内核角度-深度理解管道站在内核角度-管道的本质管道读写规则管道特点命名管道创建一个命名管道匿名管道与命名管... 查看详情

linux系统开发:学习linux下网络编程(代码片段)

第一章TCP网络编程1.1socket创建套接字#include<sys/types.h>#include<sys/socket.h>intsocket(intdomain,inttype,intprotocol);功能创建网络套接字,用于网络通信使用,类似于文件操作的open函数。该函数在服务器和客户端都会用到。参... 查看详情