zoukankan      html  css  js  c++  java
  • 0707 父子进程之间传递文件描述符

      1 /*************************************************************************
      2     > File Name: pass_fd.c
      3     > Author:Monica
      4     > Mail:liling222@126.com 
      5     > Created Time: Mon 07 Jul 2014 09:52:49 PM CST
      6  ************************************************************************/
      7 
      8 #include <stdio.h>
      9 #include <sys/types.h>
     10 #include <sys/socket.h>
     11 #include <strings.h>
     12 #include <stdlib.h>
     13 #include <unistd.h>
     14 #include <signal.h>
     15 #include <sys/stat.h>
     16 #include <fcntl.h>
     17 #include <string.h>
     18 
     19 void my_handler(int signum)
     20 {
     21     wait(NULL);
     22     exit(0);
     23 }
     24 void send_n(int fd_socket, int fd_to_send);
     25 void recv_n(int fd_socket, int* fd_to_recv);
     26 
     27 int main(int argc, char* argv[])    //exe  filename
     28 {
     29     int fd_socket[2];
     30     int fd_file;
     31     if(socketpair(AF_LOCAL, SOCK_STREAM, 0, fd_socket) == -1)
     32     {
     33         perror("socketpair");
     34         exit(-1);
     35     }
     36     if(fork()>0)    //parent fd[0]
     37     {
     38         close(fd_socket[1]);
     39         signal(SIGCHLD, my_handler);
     40         fd_file = open(argv[1], O_RDONLY);
     41         if(fd_file == -1)
     42         {
     43             perror("open");
     44             close(fd_socket[0]);
     45             close(fd_socket[1]);
     46             exit(-1);
     47         }
     48         send_n(fd_socket[0], fd_file);
     49         printf("parent fd_file:%d
    ", fd_file);
     50         close(fd_file);
     51         close(fd_socket[0]);
     52         return;
     53     }
     54     else    //child fd[1]
     55     {
     56         int fd_to_recv;
     57         char buf[1024];
     58         close(fd_socket[0]);
     59         recv_n(fd_socket[1], &fd_to_recv);
     60         printf("child recv fd:%d
    ", fd_to_recv);
     61         FILE* fp = fdopen(fd_to_recv, "r");
     62         while(bzero(buf, 1024), fgets(buf, 1024, fp) != NULL)
     63         {
     64             printf("%s", buf);
     65         }
     66         fclose(fp);
     67         close(fd_to_recv);
     68         close(fd_socket[1]);
     69     }
     70     return 0;
     71 }
     72 void send_n(int fd_socket, int fd_to_send)
     73 {
     74     struct msghdr send_msg;
     75     struct iovec  bufs[1];
     76     struct cmsghdr *pcmsg;
     77     char buffer[]="hello world";
     78     int cmsglen = CMSG_LEN(sizeof(int));
     79     send_msg.msg_name = NULL;
     80     send_msg.msg_namelen = 0;
     81     send_msg.msg_flags = 0;
     82     bufs[0].iov_base = buffer;
     83     bufs[0].iov_len = strlen(buffer);
     84     send_msg.msg_iov = bufs;
     85     send_msg.msg_iovlen = 1;
     86     pcmsg = (struct cmsghdr*)calloc(1, cmsglen);
     87     pcmsg->cmsg_len = cmsglen;
     88     pcmsg->cmsg_level = SOL_SOCKET;
     89     pcmsg->cmsg_type = SCM_RIGHTS;
     90     *(int*)CMSG_DATA(pcmsg) = fd_to_send;
     91     send_msg.msg_control = pcmsg;
     92     send_msg.msg_controllen = cmsglen;
     93     sendmsg(fd_socket, &send_msg, 0);
     94 }
     95 
     96 void recv_n(int fd_socket, int* fd_to_recv)
     97 {
     98     struct msghdr recv_msg;
     99     struct iovec  bufs[1];
    100     struct cmsghdr*  pcmsg;
    101     char buffer[1024]="";
    102     int cmsglen = CMSG_LEN(sizeof(int));
    103     pcmsg = (struct cmsghdr*)calloc(1,cmsglen );
    104     bufs[0].iov_base = buffer;
    105     bufs[0].iov_len = 1024;
    106     recv_msg.msg_iov = bufs;
    107     recv_msg.msg_iovlen = 1;
    108     recv_msg.msg_control = pcmsg;
    109     recv_msg.msg_controllen = cmsglen;
    110     recvmsg(fd_socket, &recv_msg, 0);
    111     printf("buf:%s
    ", buffer);
    112     *fd_to_recv = *(int*)CMSG_DATA(pcmsg);
    113 }
  • 相关阅读:
    《基于B_S模式的教务管理系统设计与实现》论文笔记(三)
    《重修补考报名考务管理信息系统中的网络技术》论文笔记(二)
    《基于WEB的独立学院补考重修管理系统研究》论文笔记(一)
    重修安排管理系统的设计与实现 文献收集
    重修安排管理系统的设计与实现 文献收集
    《暗时间》读书笔记
    R、Python、Scala 和 Java,到底该使用哪一种大数据编程语言?
    编程和音乐真的很像吗?
    关于虚拟现实叙事方式的终极入门指南
    如何避免脆弱的代码
  • 原文地址:https://www.cnblogs.com/monicalee/p/3830633.html
Copyright © 2011-2022 走看看