几个I/O相关的函数:
#includessize_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函数的原型:
#includeint shutdown(int sockfd, int how);
就是因为多了一个how选项,使得shutdown的功能多于close函数。how可以设置为:SHUT_RD, SHUT_WR, SHUT_RDWR。分别是代表关闭读,关闭写,关闭读写(等价于close)。
为了获取服务器的时间符合需要的格式,还使用了strftime函数:
#includesize_t strftime(char *s, size_t max, const char *format, const struct tm *tm);
参数介绍见:
下一篇将介绍。