zoukankan      html  css  js  c++  java
  • shell 命名管道,进程间通信, ncat作http server

    命名管道基础

    命名管道也被称为FIFO文件, 在文件系统中是可见的,并且跟其它文件一样可以读写!

    命名管道特点:

    1. 当写进程向管道中写数据的时候,如果没有进程读取这些数据,写进程会堵塞
    2. 当读取管道中的数据的时候,如果没有数据,读取进程会被堵塞
    3. 当写进程堵塞的时候,有读进程读取数据,那么写进程恢复正常
    4. 当读进程堵塞的时候,如果写进程写了数据,那么读进程会读取数据,然后正常执行后面的代码

       # 写进程堵塞的情况
       [root@ns_10.2.1.242 test]$ echo 1 >p &
       [1] 17091
       [root@ns_10.2.1.242 test]$ jobs
       [1]+  Running                 echo 1 > p &
       [root@ns_10.2.1.242 test]$ cat p
       1
       [1]+  Done                    echo 1 > p
       [root@ns_10.2.1.242 test]$ jobs 
       [root@ns_10.2.1.242 test]$
      
       # 读进程堵塞的情况
       [root@ns_10.2.1.242 test]$ cat p &
       [1] 17351
       [root@ns_10.2.1.242 test]$ jobs
       [1]+  Running                 cat p &
       [root@ns_10.2.1.242 test]$ echo 2 > p
       2
       [root@ns_10.2.1.242 test]$ jobs
       [1]+  Done                    cat p

    命名管道的作用,不同的进程之间通信,比如在后台执行一个备份进程,然后执行另外一个进程,等待备份完成才会处理想对应的事情!

    创建管道的命令:
    $ mkfifo /tmp/testpipe
    $ mknod /tmp/testpipe p

    下面是命名管道的一个应用例子:

    reader.sh读取管道的内容,代码如下:

    #!/bin/bash
    # filename: reader.sh
    # 逐行读取管道中的内容
    
    pipe=/tmp/testpipe
    
    trap "rm -f $pipe" EXIT
    
    if [[ ! -p $pipe ]]; then
        mkfifo $pipe
    fi
    
    while true
    do
        if read line <$pipe; then
            if [[ "$line" == 'quit' ]]; then
                break
            else
                echo $line   
            fi
     
        fi
    done
    
    echo "Stop reader...."

    writer.sh写数据到管道,代码如下:

    #!/bin/bash
    # writer.sh
    # 把当前进程的pid写到管道
    pipe=/tmp/testpipe
    
    if [[ ! -p $pipe ]]; then
        echo "Reader not running"
        exit 1
    fi
    
    
    if [[ "$1" ]]; then
        echo "$1" >$pipe
    else
        echo "Hello from $$" >$pipe
    fi

    reader和writer调用的例子:

    [root@ns_10.2.1.242 test]$ sh reader.sh &
    [1] 17053
    [root@ns_10.2.1.242 test]$ sh writer.sh test
    test
    [root@ns_10.2.1.242 test]$ sh writer.sh 
    Hello from 17057
    [root@ns_10.2.1.242 test]$ sh writer.sh quit
    stop Reader
    [root@ns_10.2.1.242 test]$ sh writer.sh quit
    Reader not running
    [1]+  Done                    sh reader.sh
    [root@ns_10.2.1.242 test]$ sh writer.sh quit

    shell 中的$$是当前进程的进程ID

    Ncat作HTTP server:

    https://github.com/sunsky/Bash-NetCat-HTTPD/

  • 相关阅读:
    推荐:VisualStudio 2005/2008的“Consolas”字体包
    [转]Calendar 動態產生子控制項的 Event Handler, 模拟__doPostBack() 回发
    Ajax ToolKit ModelPopupExtender应用经验二则
    [转]Calendar 控件日期复选
    ASP.NET偷懒大法六(可空类型的动态赋值)
    弹出层(Div)屏蔽父窗口并且让父窗口变暗
    CSS巧用expression来区分只读文本框
    formValidator用户注册表单自动验证
    基于Session原理的验证码方案
    jQuery解决IE6下PNG图片背景透明问题
  • 原文地址:https://www.cnblogs.com/sunsky303/p/12079090.html
Copyright © 2011-2022 走看看