zoukankan      html  css  js  c++  java
  • 两个进程进行通信的简单例子

    add2.c 编译后生成执行文件add2

    一个简单的加法运算器 通过标准输入端获取参数 标准输出端返回结果

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>

    #define MAXLINE 1024
    int main(int argc,char *argv[])
    {
        int n,int1,int2;
        char line[MAXLINE];
        while((n = read(STDIN_FILENO,line,MAXLINE)) > 0)
        {
            line[n]=0;
            if(sscanf(line, "%d%d", &int1, &int2) == 2)
            {
                sprintf(line,"%d ",int1 + int2);
                n = strlen(line);
                if(write(STDOUT_FILENO,line,n) != n)
                {
                    printf("write error ");
                    exit(1);
                }    
                
            }
            else
            {
                if(write(STDOUT_FILENO,"invalid args ",13) != 13)
                {
                    printf("write error ");
                    exit(1);
                }
            }
        }    
        return 0;
    }

    add1.c 编译后生成执行文件add1

    add1运行时将提示输入参数(123 456)获取参数后调用add2进行加法运算,获取结果并打印

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>
    #include <signal.h>

    #define MAXLINE 1024

    static void sig_pipe(int);
    int main(int argc,char *argv[])
    {
        int n,fd1[2],fd2[2];
        pid_t pid;
        char line[MAXLINE];
        if(signal(SIGPIPE,sig_pipe) == SIG_ERR)
        {
            printf("signal error ");
            exit(1);
        }
        if(pipe(fd1) < 0 || pipe(fd2) < 0)
        {
            printf("pipe error ");
            exit(1);
        }
        if((pid = fork()) < 0)
        {
            printf("fork error ");
            exit(1);
        }
        else if(pid > 0)
        {
            close(fd1[0]);
            close(fd2[1]);
            while(fgets(line,MAXLINE,stdin) != NULL)
            {
                n = strlen(line);
                if(write(fd1[1],line,n) != n)
                {
                    printf("write error to pipe ");
                    exit(1);
                }
                if((n = read(fd2[0],line,MAXLINE)) < 0)
                {
                    printf("read error from pipe ");
                    exit(1);
                }
                if(n == 0)
                {
                    printf("chile closed pipe ");
                    break;
                }
                line[n]=0;
                if(fputs(line,stdout) == EOF)
                {
                    printf("fputs error ");
                    break;
                }
            }
            if(ferror(stdin))
            {
                printf("fgets  error on stdin ");
                exit(1);
            }
            exit(0);
        }
        else
        {
            close(fd1[1]);
            close(fd2[0]);
            if(fd1[0] != STDIN_FILENO)
            {
                if(dup2(fd1[0],STDIN_FILENO) != STDIN_FILENO)
                {
                    printf("DUP2  error to stdin ");
                    exit(1);
                }
                close(fd1[0]);    
            }
            if(fd2[1] != STDOUT_FILENO)
            {
                if(dup2(fd2[1],STDOUT_FILENO) != STDOUT_FILENO)
                {
                    printf("DUP2  error to stdout ");
                    exit(1);
                }
                close(fd2[1]);    
            }
            if(execl("./add2","add2",(char *)0) < 0)
            {
                printf("execl  error ");
                exit(1);
            }
        }
        return 0;
    }
    static void sig_pipe(int signo)
    {    
        printf("SIGPIPE caught ");
        exit(1);
    }

  • 相关阅读:
    有没有用户体验+UI+前端集于一身的人
    ruby array.count
    ruby subset
    向李刚同学道歉
    rails3转载
    RVM and Capistrano
    paperclip自定制文件名
    ruby爬虫
    rails3已经内置subdomain
    摘录
  • 原文地址:https://www.cnblogs.com/xieweiwei/p/3254991.html
Copyright © 2011-2022 走看看