zoukankan      html  css  js  c++  java
  • Linux环境进程间通信----信号与管道

    一、信号:

         信号主要用来通知进程异步事件的发生。可以使用“kill -l ”命令来显示系统中的信号。进程可以忽略大部分信号,但是有两个是不能忽略的:

        (1)SIGSTOP:这个信号将中断进程的执行。

        (2)SIGKILL:这个信号将强制进程退出。

         Linux使用了堆栈来管理要执行的信号处理程序,这样当一个信号处理程序完成操作时,下一个将被调用,依次下去。

         当进程收到信号后,怎么处理这个信号多半是由收到信号的那个进程自行决定,除非收到的信号是SIGKILL之类只能采取默认行动的信号。Linux处理信号主要有下面4种方式:

        (1)采用系统默认的处理方式。一般而言,进程对信号的默认处理方式都是终止运行。

        (2)忽略该信号。

        (3)暂时搁置该信号。

        (4)由程序设计人员利用系统调用signal设定处理信号的函数。以下是一个例子:

    /*
     * signalHandler.ci
     *
     *  Created on: Aug 4, 2013
     *      Author: root
     */
    
    #include <stdio.h>
    #include <signal.h>
    
    void initfunc(int signum);
    void exitfunc(int signum);
    
    int main(){
        char buffer1[100], buffer2[100];
        int i;
        if(signal(SIGINT, &initfunc) == -1){
            printf("Couldn't register signal handler for SIGINT!
    ");
            exit(1);
        }
        if(signal(SIGTSTP, &initfunc) == -1){
            printf("Couldn't register signal handler for SIGSTP!
    ");
            exit(1);
        }
        if(signal(SIGTERM, &exitfunc) == -1){
            printf("Couldn't register signal handler for SIGTERM!
    ");
            exit(1);
        }
        printf("Pid of This Process: %d
    ", getpid());
        for(;;){
            printf("Please input:
    ");
            fgets(buffer1, sizeof(buffer1), stdin);
            for(i=0;i<100;i++){
                if(buffer1[i] >=97 && buffer1[i] <=122){
                    buffer2[i] = buffer1[i]-32;
                }else{
                    buffer2[i] = buffer1[i];
                }
            }
            printf("Your input is: %s
    ", buffer2);
        }
        exit(0);
    }
    
    void initfunc(int signum){
        printf("catch signal %d
    ", signum);
    }
    void exitfunc(int signum){
        printf("signal SIGTERM
    ");
        exit(1);
    }

          程序的执行结果如下:

          注:在一个终端中执行该程序时,按下Ctrl+Z, 会打印catch signal 20;按下Ctrl+C,会打印catch signal 2;在终端的另一个窗口中输入kill 2457,程序会打印signal SIGTERM,然后退出。

    二、管道

         管道,就是将一个进程的标准输出和另一个进程的标准输入联系到一起,以供两个进程相互通信的方法。管道是UNIX中最古老的进程通信机制,Linux中也提供了管道。它的应用非常广泛,就连Linux命令行中也有使用,例如:

        

         这条命令中,ls的输出作为sort的输入,sort的输出又作为head -5的输入,head -5的输出将出现在屏幕上。这条命令的最终执行结果是将文件列表排序,但只输出前五行。从中可以直观地看到管道的特点。

      

  • 相关阅读:
    noip2001统计单词个数
    查看大图 zoomImage
    图片懒加载 lazyload
    ANSI_NULLS 和 QUOTED_IDENTIFIER
    Framewrok损坏导致卸载不了的解决办法
    kindeditor 上传图片 显示绝对 路径
    Could not load file or assembly 'MagickNet.dll'
    sql server 复制 需要有实际的服务器名称才能连接到服务器……
    iisapp 命令 弹出 iisschlp.wsc [88,25] 属性值无效 progid
    IIS 301重定向 报错 地址后面有eurl.axd
  • 原文地址:https://www.cnblogs.com/wangle1001986/p/3236303.html
Copyright © 2011-2022 走看看