博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
套接口和I/O通信
阅读量:5317 次
发布时间:2019-06-14

本文共 2878 字,大约阅读时间需要 9 分钟。

  几个I/O相关的函数:

#include 
ssize_t read(int fd, void *buf, size_t count);ssize_t write(int fd, const void *buf, size_t count);int close(int fd);

  为了实现通信,fd可以是套接口(见)的描述符。使用示例如下:

 

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#ifndef SHUT_WR#define SHUT_WR 1#endifint main(){ int z; int s[2]; char *msgp; int mlen; pid_t chpid; char buf[80]; z = socketpair(AF_LOCAL,SOCK_STREAM,0,s); if (z==-1) { fprintf(stderr,"%s:socketpair(AF_LOCAL,SOCK_STREAM,0)\n",strerror(errno)); exit(1); } //char *cp; //z=write(s[1],cp="Hello?",6); //printf("Wrote message '%s' on s[1]\n",cp); //z=read(s[0],buf,sizeof buf); //buf[z]=0; //printf("Received message '%s' from socket s[0]\n",buf); printf("s[0]=%d;\n",s[0]); printf("s[1]=%d;\n",s[1]); chpid = fork(); if ( chpid == (pid_t)-1 ) { fprintf(stderr,"%s:fork(2)\n",strerror(errno)); exit(1); } else if (chpid==0) { char rxbuf[80]; printf("Parent PID is %ld\n",(long)getppid()); close(s[0]); s[0]=-1; msgp="%Y-%m-%d %A %H:%M %P"; mlen=strlen(msgp); printf("Child sending request '%s'\n",msgp); fflush(stdout); z=write(s[1],msgp,mlen); if (z<0) { fprintf(stderr,"%s:write(2)\n",strerror(errno)); exit(1); } /* if (shutdown(s[1],SHUT_WR)==-1) { fprintf(stderr,"%s:shutdown(2)\n",strerror(errno)); exit(1); } */ z=read(s[1],rxbuf,sizeof rxbuf); if (z<0) { fprintf(stderr,"%s:read(2)\n",strerror(errno)); exit(1); } rxbuf[z]=0; printf("Server returned '%s' \n",rxbuf); fflush(stdout); close(s[1]); } else { int status; char txbuf[80]; time_t td; printf("Child PID is %ld\n",(long)chpid); fflush(stdout); close(s[1]); s[1]=-1; z=read(s[0],buf,sizeof buf); if (z<0) { fprintf(stderr,"%s:read(2)\n",strerror(errno)); exit(1); } buf[z]=0; time(&td); strftime(txbuf,sizeof txbuf, buf, localtime(&td)); z=write(s[0],txbuf,strlen(txbuf)); if (z<0) { fprintf(stderr,"%s:write(2)\n",strerror(errno)); exit(1); } close(s[0]); waitpid(chpid,&status,0); } //system("netstat --unix -p"); return 0;}

  例子有点长,

  //z=write(s[1],cp="Hello?",6);    //printf("Wrote message '%s' on s[1]\n",cp);   //z=read(s[0],buf,sizeof buf);   //buf[z]=0;    //printf("Received message '%s' from socket s[0]\n",buf);

   这一小段就实现了通信,我已经注释掉了,因为后面写的代码是一个获取服务器时间的代码。这一段代码就是从s[1]写数据,然后从s[0]读取数据。这点和管道是一样的。但是套接口的好处是还可以从s[0]写数据,从s[1]读数据。

  后面的大段代码中使用了shutdown函数,是用于关闭套接口的专用函数,关闭套接口优先使用shutdown函数而不是close函数。shutdown函数的原型:

#include 
int shutdown(int sockfd, int how);

  就是因为多了一个how选项,使得shutdown的功能多于close函数。how可以设置为:SHUT_RD, SHUT_WR, SHUT_RDWR。分别是代表关闭读,关闭写,关闭读写(等价于close)。

  为了获取服务器的时间符合需要的格式,还使用了strftime函数:

#include 
size_t strftime(char *s, size_t max, const char *format, const struct tm *tm);

  参数介绍见:

  下一篇将介绍。

转载于:https://www.cnblogs.com/hanxi/archive/2012/06/04/2533868.html

你可能感兴趣的文章
DCDC(4.5V to 23V -3.3V)
查看>>
kettle导数到user_用于left join_20160928
查看>>
activity 保存数据
查看>>
scrapy-加蘑菇代理
查看>>
typescript深copy和浅copy
查看>>
linux下的静态库与动态库详解
查看>>
hbuilder调底层运用,多张图片上传
查看>>
深入理解基于selenium的二次开发
查看>>
11、类的继承
查看>>
单片机的动手实践篇--51单片机玩转12864
查看>>
较快的maven的settings.xml文件
查看>>
Git之初体验 持续更新
查看>>
easyui-window 关闭事件,只要关闭窗口就会触发
查看>>
centso7网卡bond
查看>>
React Native之遇到的问题
查看>>
Newick format tree
查看>>
软件开发模型之瀑布模型
查看>>
Java 中 String的indexOf 的用法
查看>>
Android Studio打开出现:Default activity not found
查看>>
一次Linux系统被攻击的分析过程
查看>>