• linux进程的管道通信


    linux进程的管道通信

    要求

    编程实现进程的管道通信,掌握管道通信的同步和互斥机制。

    相关函数

    • pipe管道
      指用于连接一个读进程和一个写进程以实现他们之间通信的一个共享文件,又名pipe文件。向管道(共享文件)提供输入的发送进程(即写进程),以字符流形式将大量的数据送入管道;而接受管道输出的接收进程(即读进程),则从管道中接收(读)数据。由于发送进程和接收进程是利用管道进行通信的,故又称为管道通信。这种方式首创于UNIX系统,由于它能有效地传送大量数据,因而又被引入到许多其它操作系统中。
      为了协调双方的通信,管道机制必须提供以下三方面的协调能力:
      1).互斥,即当一个进程正在对pipe执行读/写操作时,其它(另一)进程必须等待。
      2).同步,指当写(输入)进程把一定数量(如4KB)的数据写入pipe,便去睡眠等待,直到读(输出)进程取走数据后,再把他唤醒。当读进程读一空pipe时,也应睡眠等待,直至写进程将数据写入管道后,才将之唤醒。
      3).确定对方是否存在,只有确定了对方已存在时,才能进行通信。

    • fork()函数
      创建的子进程是fork调用者进程(即父进程)的复制品,除了进程标识数以及与进程特性有关的一些参数外,其他都与父进程相同,与父进程共享文本段和打开的文件,并都受进程调度程序的调度.
      如果创建进程失败,则fork()返回值为-1,若创建成功,则从父进程返回值是子进程号,从子进程返回的值是0

    • 互锁
      lockf(files,function,size):用于锁定文件的某些段或整个文件。本函数适用的头文件为:#include<unistd.h>,
      参数定义:int lockf(files,function,size)
      int files,founction;
      long size;
      files 是文件描述符,function表示锁状态,1表示锁定,0表示解锁;size是锁定或解锁的字节数,若为0则表示从文件的当前位置到文件尾。

    流程图

    实现

    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    #include<signal.h>
    #include<sys/wait.h>
    int main()
    {
        pid_t pid1,pid2;
        int fd[2];
        char out_pip[100],in_pip[100];
        pipe(fd);
    
        while((pid1=fork())==-1);
        if(pid1==0)//pid1
        {
            lockf(fd[1],1,0);
            sprintf(out_pip,"process 1 is sending message.
    ");
            write(fd[1],out_pip,50);
            
            sleep(1);
            lockf(fd[1],0,0);
            exit(0);
        }
        else
        {
            while((pid2=fork())==-1);
            if(pid2==0)//pid2 
            {
                lockf(fd[1],1,0);
                sprintf(out_pip,"process 2 is sending message.
    ");
                write(fd[1],out_pip,50);
                
                sleep(1);
                lockf(fd[1],0,0);
                exit(0);
            }
            else// main process
            {
                wait(0);
                read(fd[0],in_pip,50);
                printf("read:%s
    ",in_pip);
    
                wait(0);
                read(fd[0],in_pip,50);
                printf("read:%s
    ",in_pip);
                exit(0);
            }
        }
        return 0;
    }
    

    结果

    打印出两个子进程分别写入的结果

  • 相关阅读:
    JavaScript运算符有哪些
    Android 之 Shape (圆角输入框)
    Java开源报表Jasper入门(2) -- 使用JasperSoft Studio创建一个简单报表
    PHP之set_error_handler()函数讲解
    PHP防止SQL注入与几种正则表达式讲解
    PHP对XML添加节点之appendChild()方法讲解
    PHP创建XML文件讲解
    PHP对XML文件操作类讲解
    PHP对XML文件操作之属性与方法讲解
    PHP之SQL防注入代码(360提供)
  • 原文地址:https://www.cnblogs.com/yueshangzuo/p/8004895.html
Copyright © 2020-2023  润新知