精华内容
下载资源
问答
  • 进程间管道通信实验
    2021-05-10 01:34:35

    操作系统实验(七)Linux环境下进程间的通信机制――管道通信

    1、实验目的

    (1)加深对进程通信概念的理解。

    (2)熟悉Linux环境。

    (3)熟悉KDE编程平台。

    2、实验内容

    进入RedHat

    Linux

    9.0,打开KDE编程平台,建立项目,编写一段源程序,使系统调用fork(),由父进程创建一个子进程,同时建立管道。父进程把消息写入管道,子进程读取管道中的消息并从屏幕打印出来。观察并分析出现的现象。

    3、实验指导

    程序清单:

    #include

    #define MSGSIZE 16

    char *msg1=”hello,world#1”;

    char *msg2=”hello,world#2”;

    char *msg3=”hello,world#3”;

    main( )

    {

    char inbuf[MSGSIZE];

    int p[2],j,pid;

    if(pipe<0) {

    perror(“pipe call”);

    exit(1);

    }

    if((pid=fork( ))<0) {

    perror(“fork call”);

    exit(2);

    }

    if(pid>0) {

    close(p[0]);

    write(p[1],msg1,MSGSIZE);

    write(p[1],msg2,MSGSIZE);

    write(p[1],msg3,MSGSIZE);

    wait((int*)0);

    }

    if (pid==0) {

    close(p[1]);

    for(j=0;j<3;j++){

    read(p[0],inbuf,MSGSIZE);

    printf(“%s\n”,inbuf);

    }

    }

    exit(0);

    }

    更多相关内容
  • 在Linux系统中使用系统调用fork()创建两个子进程,使用系统调用pipe()建立一个管道,两个子进程分别向管道各写一句话: Child process 1 is sending a message! Child process 2 is sending a message! 而父进程则...
  • 这个文档是基于有名管道进程间通信的一些实验,可以从本质上理解进程间通信的有名管道的机理。并附有源码,可以自己复制下来,进行调试。
  • 主要介绍了Linux通过匿名管道进行进程间通信,介绍了什么是管道,popen函数,pipe调用等相关内容,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
  • 3.(3)进程间信号通信 4.(4)进程的管道通信 编写程序,创建两个子进程。当此程序运行时,系统中有一个父进程和两个子进程。父进程在屏幕上显示“Parent”,子进程分别在屏幕上显示“Child1”和“Child2”。 ...
  • (2)了解和掌握管道通信机制。二、实验预备知识(1)管道的概念:管道是一种先入先出的、单向的、大小固定的通信通道。写进程在管道的一端写入数据,读进程从管道的另一端读出数据。如果两个或多个进程同时对一个...

    目录

    一、实验目的

    二、实验预备知识

    三、实验内容

    四、实验结果分析


    一、实验目的

    (1)了解Linux系统中进程通信的基本原理。

    (2)了解和掌握管道通信机制。

    二、实验预备知识

    (1)管道的概念:管道是一种先入先出的、单向的、大小固定的通信通道。写进程在管道的一端写入数据,读进程从管道的另一端读出数据。如果两个或多个进程同时对一个进程进行读写,那么这些进程必须使用锁机制或者信号量机制对其进行同步。

    (2)管道的分类:管道分为无名管道和有名管道。无名管道没有名字,所以只能提供给进程家族中的父子进程间通信使用,而有名管道则用于没有家族关系的任意两个进程之间的通信。

    (3)管道的创建:

    pipe (int fd[]);

    这个函数创建一个管道,以便通过文件描述符 int fd[] 来访问:fd[0] 为管道的读出端,而 fd[1] 为管道的写入端。UNIX 将管道作为一种特殊类型的文件。因此,访问管道可以采用普通的系统调用 read() 和 write()。

             从管道中读

    read(fd[]);

              从管道中写

    write(fd[]);

    三、实验内容

    编写一段程序,实现进程的管道通信。使用系统调用pipe( )建立一条管道,创建两个子进程P1和P2。 父进程向管道写入两句话:

    Child1 receive   message1!

    Child2 receive  message2!

    让P1和P2从分别从管道中读出来自于父进程的信息,显示在屏幕上。

    要求进程P1先接受父进程发来的消息1,然后进程P2再接受父发来的消息2。 

    #include<stdio.h>
    #include<unistd.h>
    #include<sys/types.h>
    #include<stdlib.h>
    #include<signal.h>
    main()
    {
    	pid_t pid1,pid2,pid;
    	int fd[2];
    	char outpipe[100],inpipe[100];
    	pipe(fd);                                 //创建一个管道
    	pid=fork();
    	if(pid==0)                                //父进程写
    	{
    		sprintf(outpipe,"Child1 receive message1!");    //把字符放入outpipe数组中
    		write(fd[1],outpipe,50);             //向管道中写长为50字节的字符
    		sprintf(outpipe,"Child2 receive message2!");
    		write(fd2[1],outpipe,50);
    		exit(0);
    	}
    	pid1=fork();
    	if(pid1==0)                                //子进程1读
    	{
    		sleep(1);    //睡眠
    		read(fd[0],inpipe,50);            //从管道中读长为50字节的字符
    		printf("\nI'm a child process1.\n");
    		printf("%s\n",inpipe);
    		exit(0);	
    	}
    	pid2=fork();
    	if(pid2==0)                                //子进程2读
    	{
    		sleep(2);    
    		read(fd[0],inpipe,50);
    		printf("I'm a child process2.\n");
    		printf("%s\n",inpipe);
    		exit(0);
    	}
    }

    以上程序中,用sleep()控制子进程1和子进程2从管道中读的先后顺序,达成了实验目的。

    四、实验结果分析

    可以看出,先出现 

    I'm a child process1.
    Child1 receive message1!

    后出现

    I'm a child process2.
    Child2 receive message2!

    证明子进程1先从管道中读,然后子进程2再从管道中读。

    展开全文
  • 实验进程间通信 实验目的 学会进程间通信方式无名管道有名管道信号消息队列 实验要求 在父进程中创建一无名管道并创建子进程来读该管道父进程来写该管道 在进程中为 SIGBUS注册处理函数并向该进程发送 SIGBUS信号 ...
  • 1.UNIX平台进程通信方式AT&T的贝尔实验室,对Unix早期的进程间通信进行了改进和扩充,形成了“system V IPC”,其通信进程主要局限在单个计算机内BSD(加州大学伯克利分校的伯克利软件发布中心),跳过了该限制,形成...

    目录

    一、Linux进程间通信概述

    1.UNIX平台进程通信方式

    2.常用的进程间通信方式

    二、无名管道PIPE

    1.无名管道的特点:

    2.无名管道的创建与关闭

    创建无名管道

    无名管道的读写

    无名管道的读写特性

    管道破裂例子

    无名管道的大小

    三、有名管道FIFO

    1.有名管道的创建

     2.有名管道进行通信例子


     

    一、Linux进程间通信概述

    1.UNIX平台进程通信方式

    早期进程间通信方式:
    AT&T的贝尔实验室,对Unix早期的进程间通信进行了改进和扩充,形成了“system V IPC”,其通

    信进程主要局限在单个计算机内

    BSD(加州大学伯克利分校的伯克利软件发布中心),跳过了该限制,形成了基于套接字(socket)的进程间通信机制
    Linux继承了上述所有的通信方式

    2.常用的进程间通信方式

    1)传统的进程间通信方式
    无名管道(pipe)、有名管道(fifo)和信号(signal)
    2)System V IPC对象
    共享内存(share memory)、消息队列(message queue)和信号灯(semaphore)
    3)BSD
    套接字(socket  用于网络通信)

    二、无名管道PIPE

     

    1.无名管道的特点:

    1)只能用于具有亲缘关系的进程之间的通信;

     

    2)半双工的通信模式,具有固定的读端和写端;

     

    3)管道可以看成是一种特殊的文件,对于它的读写可以使用文件IO如read、write函数

    2.无名管道的创建与关闭

     

    无名管道是基于文件描述符的通信方式(但这个文件在文件系统中不可见)。当一个管道建立时,它会
    创建两个文件描述符fd[0]和fd[1]。 其中fd[0]固定用于读管道,而fd[1]固定用于写管道。

     

    构成了一个半双工的通道。

     

    创建无名管道

    首先来看创建函数

     eg:

    int main()
    {
    int pfd[2];
    if (pipe(pfd) < 0) /*创建无名管道*/
    {
    printf("pipe create error\n");//利用返回值判断是否创建成功
    return -1;
    }
    else
    {
    printf("pipe create success\n");
    }
    close(pfd[0]); /*关闭管道描述符*/
    close(pfd[1]);
    }

    无名管道的读写

    先举个例子实现子进程写入父进程读出

    #include <stdio.h>
    #include <unistd.h>
    #include <string.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    int main(int argc, char *argv[])
    { 
        int pfd[2] = {0};//创建无名管道
    
        int ret = pipe(pfd);
        if(ret < 0)
        {
            perror("pipe");
            exit(-1);
        }
    
        pid_t pid = fork();//创建子进程
        if(pid < 0)
        {
            perror("fork");
            exit(-1);
        }
    
        if(pid == 0)
        {
            char buf[64] = {0};//自定义缓冲区,用于存入终端输入信息
            while(1)
            {
                fgets(buf, 64, stdin);
                buf[strlen(buf)-1] = '\0';    
                write(pfd[1], buf, strlen(buf));//子进程执行写操作
            }
        }
        else
        {
            char buf1[64] = {0};
    
            while(1)//父进程进行读操作
            {
                memset(buf1, 0, 64);//清空缓冲区操作,因为自定义缓冲区可能存在上次读入的数据
                read(pfd[0], buf1, 64);
                printf("father ---- %s\n", buf1);//展示读入的数据
            }
            wait(NULL);//回收子进程资源
            exit(0);
        }
        return 0;
    } 

    无名管道的读写特性

    读特性:

    当写端存在时:

    管道有数据:返回读到的字节数

    管道无数据:阻塞

    当写端不存在时:

    管道有数据:返回读到的数据

    管道无数据:返回0;

    写特性:

    当读端存在时:

    管道有空间:返回写入的字节数

    管道无空间:阻塞,直到有空间为止

    当读端不存在时:

    无论管道是否有空间,管道破裂 SIGPIPE

    管道破裂例子

    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <string.h>
    
    int main(int argc, char *argv[])
    { 
        int pfd[2] = {0};
        int ret = pipe(pfd);   //创建无名管道
        if(ret < 0)
        {
            perror("pipe");
            exit(-1);
        }
    
        close(pfd[0]);         //关闭无名管道的读端
        pid_t pid = fork();     //创建子进程
    
        if(pid == 0)
        {
            write(pfd[1], "hello", 5);
            
            sleep(5);
        }
    	else
    	{
    		int status;
    		wait(&status);
    		
    		printf("%d %d %d\n", WIFEXITED(status),WIFSIGNALED(status),WTERMSIG(status));//展示错误信息
    		
    		exit(0);
    	}
    
        return 0;
    } 

    无名管道的大小

    可以以下方式计算

    #include <stdio.h>
    #include <unistd.h>
    int main(int argc, char *argv[])
    { 
        int pfd[2] = {0};
        pipe(pfd);
        
        int ret = 0;
        int size = 0;
        char buf[1] = {0};
        while(1)//一直往管道里写数据
        {
            ret = write(pfd[1], buf, 1);//利用write返回值来计算,write会返回写入的字节数,这里我们一次就写一个0,然后循环进行累加,直到管道被塞满
            size = size+ret;
            printf("size = %d\n", size);
        }
        
        return 0;
    } 

    这里注意几个要点

    1)当管道中无数据时,读操作会阻塞
    2)向管道中写入数据时,linux将不保证写入的原子性,管道缓冲区一有空闲区域,写进程就会试图向管道写入数据。如果读进程不读走管道缓冲区中的数据,那么写操作将会一直阻塞。
    3)只有在管道的读端存在时,向管道中写入数据才有意义。否则,向管道中写入数据的进程将收到内核传来的SIGPIPE信号(通常Broken pipe错误)。

    三、有名管道FIFO

    1)无名管道只能用于具有亲缘关系的进程之间,这就限制了无名管道的使用范围有名管道可以使互不相关的两个进程互相通信。

     

    2)有名管道可以通过路径名来指出,并且在文件系统中可见进程通过文件IO来操作有名管道( 意思就是在系统文件中可见 )

     

    3)有名管道遵循先进先出规则

     

    4)不支持如lseek() 操作

    1.有名管道的创建

     因为有名管道是一个文件,所以在操作有名文件时,要先创建一个有名文件,且操作时也有open和close操作

    创建例子 

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <stdlib.h>
    int main(int argc, char *argv[])
    { 
        int ret = mkfifo("fifo", 0664);//文件属性一般为0664
        if(ret < 0)
        {
            perror("mkfifo");
            exit(-1);
        }
    
    
        return 0;
    } 

     2.有名管道进行通信例子

    读操作进程

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(int argc, char *argv[])
    { 
        int fd = open("fifo", O_RDONLY);
        if(fd < 0)
        {
            perror("open");
            exit(-1);
        }
        
        printf("open fifo ok!\n");
    
        char buf[64] = {0};
        while(1)
        {
            memset(buf, 0, 64);
            read(fd, buf, 64);
            printf("%s\n", buf);
        }
    
        close(fd);
        return 0;
    } 

    写操作进程

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(int argc, char *argv[])
    { 
        int fd = open("fifo", O_WRONLY);
        if(fd < 0)
        {
            perror("open");
            exit(-1);
        }
        
        printf("open fifo ok!\n");
    
        char buf[64] = {0};
        while(1)
        {
            fgets(buf, 64, stdin);
            buf[strlen(buf)-1] = '\0';
    
            write(fd, buf, strlen(buf));
        }
    
        close(fd);
        return 0;
    } 

    注:两个进程要同在运行状态,管道的读写操作才能执行,如果只有一方运行,程序会一直程阻塞状态

     

    展开全文
  • 实验目的通过编写有名管道多路通信实验,进一步掌握管道的创建、读写等操作,同时复习使用select()函数实现管道的通信。实验内容这里采用管道函数创建有名管道(不是在控制台下输入命令mknod),而且使用select()函数...

    实验目的

    通过编写有名管道多路通信实验,进一步掌握管道的创建、读写等操作,同时复习使用select()函数实现管道的通信。

    实验内容

    这里采用管道函数创建有名管道(不是在控制台下输入命令mknod),而且使用select()函数替代poll()函数实现多路复用。如果对管道通信的知识忘了的话,请看这篇博客:

    实验步骤

    实验流程图如下

    0818b9ca8b590ca3270a3433284dd417.png

    本实验用到了一些函数,主要是FD_ISSET()函数是新的,其它的函数在开头的网址的链接博客中都可以找到。

    源程序

    pipe_select.c文件,如有需要,

    0818b9ca8b590ca3270a3433284dd417.png

    0818b9ca8b590ca3270a3433284dd417.png

    0818b9ca8b590ca3270a3433284dd417.png

    0818b9ca8b590ca3270a3433284dd417.png

    0818b9ca8b590ca3270a3433284dd417.png

    实验步骤

    将上述程序编译后,必须先运行该程序(即./pipe_select),然后再另外打开两个虚拟终端,分别进入你的pipe_select所在目录(一定要进入这个目录噢,否则程序没有结果),分别在两个虚拟终端输入“cat > in1”和"cat > in2",接着在管道中输入相关内容。执行结果如下图:

    终端1

    0818b9ca8b590ca3270a3433284dd417.png

    终端2

    0818b9ca8b590ca3270a3433284dd417.png

    终端3

    0818b9ca8b590ca3270a3433284dd417.png

    可以看到此时在当前文件夹下已经创建了两个管道

    0818b9ca8b590ca3270a3433284dd417.png

    展开全文
  • 在Linux系统下实现进程从创建到终止的全过程,从中体会进程的创建过程、父进程和子进程之间的关系、进程状态的变化、进程之间的互斥、同步机制、进程调度的原理和以管道为代表的进程间通信方式的实现。 2. 内容及...
  • 管道简介管道是Linux中进程间通信的一种方式,它把一个程序的输出直接连接到另一个程序的输入(其实我更愿意将管道比喻为农村浇地的管子)。Linux的管道主要包括两种:无名管道和有名管道。这一节主要讲无名管道,首先...
  • 实验2 Linux软中断通信 1.实验目的 通过本实验掌握软中断的基本原理掌握中断信号的使用进程的创建以及系统计时器的使用 2.实验内容上交的实验2统一取名为test2) 由父进程创建两个子进程通过终端输入Crtl+\组合键向父...
  • linux C语言开发管道通信  Linux系统本身为进程间通信提供了很多的方式,比如说管道、共享内存、socket通信等。管道的使用十分简单,在创建了匿名管道之后,我们只需要从一个管道发送数据,再从另外一个管道接受...
  • 实验报告详细描述了进程间通信的实现原理,使用管道以及信号实现进出那个间通信,附有源代码实现。
  • #includeint pid1,pid2;main( ){int fd[2],i=0,j=0;char outpipe[100],inpipe1[100],inpipe2[100],outpipe1[100];pipe(fd); /*创建一个管道*/while ((pid1=fork( ))==-1);/*向管道中写入字符*/lockf(fd[1],1...
  • 操作系统 实验四 进程间通信实验

    千次阅读 2021-11-26 11:26:02
    实验四 进程间通信实验 一、实验目的 1、了解什么是信号。 2、熟悉LINUX系统中进程之间软中断通信的基本原理。 3、理解进程的同步关系。 4、了解什么是管道。 5、熟悉UNIX/LINUX支持的管道通信方式。 二、...
  • 标签:操作系统(344)Linux(1563)8.7.1 管道通信实验1.实验目的通过编写有名管道多路通信实验,读者可进一步掌握管道的创建、读写等操作,同时,也复习使用select()函数实现管道的通信。2.实验内容读者还记得在...
  • 进程间通信-匿名管道

    2022-05-04 08:51:35
    匿名管道进程间通信进程间通信方式管道System V IPCPOSIX IPC管道创建管道匿名管道子进程不断写入,父进程不进行读取写端一直写入,读端完成一次读取后退出写端关闭,读端一直读取总结匿名管道特点 进程间通信 ...
  • 进程管道通信实验 操作系统 课程设计 大家看看 好的顶啊
  • 目录一 回顾二 有名管道1 有名 管道 创建三 有名管道进程间通信1 直接撸代码 一 回顾 实验 ps aux | grp “bash” 1 ps aux :父进程 grp “bash”:子进程 但是不能直接通信 2 需要把 父进程 重定向为管道 也...
  • 实验内容:进程间通信管道和 socket 通信。 编译运行课件 Lecture11 例程代码: alg.11-3-socket-input-2.c alg.11-4-socket-connector-BBS-2.c alg.11-5-socket-server-BBS-3.c 实验环境 架构:Intel x86...
  • 进程间通信总结

    2021-01-21 15:02:40
    概念:一种用于有亲缘关系的两个或多个进程之间的通信手段,可以提供单向的数据流,又称为无名管道。由于管道没有名字,只能用于有共同祖先进程的各个进程之间通信。 特点: (1)半双工通信(即单向数据流),有...
  • 管道简介:管道进程之间通信的一种方式,就相当于是两个进程之间有一条地道,可以通过地道来传递信息;管道位于进程的地址空间之外;管道分为匿名管道和命名管道两种;匿名管道是由pipe来创建的,命名管道是由...
  • Linux进程间通信管道编程实例popen函数和pclose函数popen函数pclose函数实例1:读取外部程序的输出实例2:将输出送往popenpopen函数的优缺点pipe调用fork不exec时的pipe调用fork+exec时的pipe调用 当从一个进程...
  • 什么是管道,联想下生活中的管道管道包括无名管道和有名管道,前者用于父子进程间通信,后者可用于同一系统中任意两进程间通信管道有如下几个特点: 单向,先进先出,类似于FIFO,它将一个进程的输出与另一...
  • 管道通信实验

    2014-12-11 21:36:31
    对于进程间的通信有很多种,而管道通信就是其中一个,这篇文章就是基于这种需要做的通信实验
  • 实验进程间通信

    2021-05-10 23:30:29
    1. 举例说明使用匿名管道进行进程通信。匿名管道:当进程使用 pipe 函数,就可以打开位于内核中的这个特殊“文件”。同时 pipe 函数会返回两个描述 符,一个用于读,一个用于写。如果你使用 fstat 函数来测试该描述...
  • 进程间通信详解

    2022-06-20 16:39:13
    进程间通信详解(命名管道,匿名管道,共享内存)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,640
精华内容 2,656
关键字:

进程间管道通信实验