zoukankan      html  css  js  c++  java
  • 信号驱动的IO

    (1)client1,基于SIGIO的写法:

     1 #include <sys/types.h>
     2 #include <sys/stat.h>
     3 #include <fcntl.h>
     4 #include <unistd.h>
     5 #include <signal.h>
     6 
     7 #include <stdio.h>
     8 #include <stdlib.h>
     9 #include <errno.h>
    10 
    11 #define BUFSIZE 128
    12 
    13 static int fdr;
    14 static int fdw;
    15 
    16 static void handler(int unuse)
    17 {
    18     int ret;
    19     char buf[BUFSIZE];
    20 
    21     ret = read(fdr, buf, BUFSIZE);
    22     if (ret == -1) {
    23         return;
    24     }
    25     if (ret == 0) {
    26         exit(0);
    27     }
    28     write(1, "33[31m", 5);
    29     write(1, buf, ret);
    30     write(1, "33[0m", 4);
    31 }
    32 
    33 int main(void)
    34 {
    35     int ret;
    36     char buf[BUFSIZE];
    37     long flags;
    38 
    39     signal(SIGIO, handler);
    40 
    41     fdr = open("f1", O_RDONLY);
    42     if (fdr == -1) {
    43         perror("f1");
    44         goto open_fdr_err;
    45     }
    46 
    47     fdw = open("f2", O_WRONLY);
    48     if (fdw == -1) {
    49         perror("f2");
    50                 goto open_fdw_err;
    51     }
    52 
    53     flags = fcntl(fdr, F_GETFL);
    54     flags |= O_ASYNC;
    55     fcntl(fdr, F_SETFL, flags);
    56 
    57     fcntl(fdr, F_SETOWN, getpid());
    58 
    59     while (1) {
    60         ret = read(0, buf, BUFSIZE);
    61         if (ret == -1) {
    62             if (errno == EINTR) {
    63                 continue;
    64             }
    65             perror("read()");
    66             break;
    67         }
    68         if (ret == 0) {
    69             break;
    70         }
    71         write(fdw, buf, ret);
    72     }
    73 
    74     close(fdw);
    75     close(fdr);
    76 
    77     return 0;
    78 
    79 
    80     close(fdw);
    81 open_fdw_err:
    82     close(fdr);
    83 open_fdr_err:
    84     return 1;
    85 }
    View Code

    client1,基于自定义信号的写法:

     1 #define _GNU_SOURCE
     2 
     3 #include <sys/types.h>
     4 #include <sys/stat.h>
     5 #include <fcntl.h>
     6 #include <unistd.h>
     7 #include <signal.h>
     8 
     9 #include <stdio.h>
    10 #include <stdlib.h>
    11 #include <errno.h>
    12 
    13 #define BUFSIZE 128
    14 
    15 static int fdr;
    16 static int fdw;
    17 
    18 static void handler(int unuse)
    19 {
    20     int ret;
    21     char buf[BUFSIZE];
    22 
    23     ret = read(fdr, buf, BUFSIZE);
    24     if (ret == -1) {
    25         return;
    26     }
    27     if (ret == 0) {
    28         exit(0);
    29     }
    30     write(1, "33[31m", 5);
    31     write(1, buf, ret);
    32     write(1, "33[0m", 4);
    33 }
    34 
    35 int main(void)
    36 {
    37     int ret;
    38     char buf[BUFSIZE];
    39     long flags;
    40 
    41     signal(SIGUSR1, handler);
    42 
    43     fdr = open("f1", O_RDONLY);
    44     if (fdr == -1) {
    45         perror("f1");
    46         goto open_fdr_err;
    47     }
    48 
    49     fdw = open("f2", O_WRONLY);
    50     if (fdw == -1) {
    51         perror("f2");
    52                 goto open_fdw_err;
    53     }
    54 
    55     flags = fcntl(fdr, F_GETFL);
    56     flags |= O_ASYNC;
    57     fcntl(fdr, F_SETFL, flags);
    58 
    59     fcntl(fdr, F_SETOWN, getpid());
    60     fcntl(fdr, F_SETSIG, SIGUSR1);
    61 
    62     while (1) {
    63         ret = read(0, buf, BUFSIZE);
    64         if (ret == -1) {
    65             if (errno == EINTR) {
    66                 continue;
    67             }
    68             perror("read()");
    69             break;
    70         }
    71         if (ret == 0) {
    72             break;
    73         }
    74         write(fdw, buf, ret);
    75     }
    76 
    77     close(fdw);
    78     close(fdr);
    79 
    80     return 0;
    81 
    82 
    83     close(fdw);
    84 open_fdw_err:
    85     close(fdr);
    86 open_fdr_err:
    87     return 1;
    88 }
    View Code

    (2)client2:

     1 #include <sys/types.h>
     2 #include <sys/stat.h>
     3 #include <fcntl.h>
     4 #include <signal.h>
     5 #include <unistd.h>
     6 
     7 #include <stdio.h>
     8 #include <stdlib.h>
     9 #include <errno.h>
    10 
    11 #define BUFSIZE 128
    12 
    13 static int fdr;
    14 static int fdw;
    15 
    16 static void handler(int unuse)
    17 {
    18     int ret;
    19     char buf[BUFSIZE];
    20 
    21     ret = read(fdr, buf, BUFSIZE);
    22     if (ret == -1) {
    23         return;
    24     }
    25     if (ret == 0) {
    26         exit(0);
    27     }
    28     write(1, "33[31m", 5);
    29     write(1, buf, ret);
    30     write(1, "33[0m", 4);
    31 }
    32 
    33 int main(void)
    34 {
    35     int ret;
    36     char buf[BUFSIZE];
    37     long flags;
    38 
    39     signal(SIGIO, handler);
    40 
    41     fdw = open("f1", O_WRONLY);
    42     if (fdw == -1) {
    43         perror("f1");
    44                 goto open_fdw_err;
    45     }
    46 
    47     fdr = open("f2", O_RDONLY);
    48     if (fdr == -1) {
    49         perror("f2");
    50         goto open_fdr_err;
    51     }
    52 
    53     flags = fcntl(fdr, F_GETFL);
    54     flags |= O_ASYNC;
    55     fcntl(fdr, F_SETFL, flags);
    56 
    57     fcntl(fdr, F_SETOWN, getpid());
    58 
    59     while (1) {
    60         ret = read(0, buf, BUFSIZE);
    61         if (ret == -1) {
    62             if (errno == EINTR) {
    63                 continue;
    64             }
    65             perror("read()");
    66             break;
    67         }
    68         if (ret == 0) {
    69             break;
    70         }
    71         write(fdw, buf, ret);
    72     }
    73 
    74     close(fdr);
    75     close(fdw);
    76 
    77     return 0;
    78 
    79 
    80     close(fdr);
    81 open_fdr_err:
    82     close(fdw);
    83 open_fdw_err:
    84     return 1;
    85 }
    View Code
  • 相关阅读:
    小知识
    对NSArray中自定义的对象进行排序
    照片浏览滑动效果UIScrollView和UIPageControl组合
    label 设置行间距 字间距
    即使通讯聊天界面搭建----iOS
    ios8推送新增
    UITableviewCell滑动出现多级的控制按钮
    iOS 去掉html标签 留下原本的字符串
    平时常用的小知识点 (不断更新中)
    IOS UI多线程 NSThread 下载并显示图片到UIImageView
  • 原文地址:https://www.cnblogs.com/takeaction/p/4376979.html
Copyright © 2011-2022 走看看