#define _GNU_SOURCE 1 #include #include #include #include #include #include #include #include static volatile int piped; static void handler(int signo) { piped=1; } int main (void) { setbuf(stdout,NULL); signal(SIGPIPE,handler); int fd=socket(PF_INET,SOCK_STREAM,0); assert(fd!=-1); struct sockaddr_in addr; memset(&addr,0,sizeof addr); addr.sin_family=AF_INET; addr.sin_addr.s_addr=htonl(INADDR_LOOPBACK); addr.sin_port=htons(5000); int i=connect(fd,(struct sockaddr *)&addr,sizeof(addr)); assert(i==0); char charbuf='a'; ssize_t ssize=send(fd,&charbuf,1,0); assert(ssize==1); fputs("sleeping ...",stdout); sleep(5); charbuf='b'; puts(" done"); errno=0; // ssize=send(fd,&charbuf,1,0); ssize=write(fd,&charbuf,1); assert_perror(errno); assert(ssize==1); // puts("send ok"); puts("write ok"); errno=0; // ssize=recv(fd,&charbuf,1,0); ssize=read(fd,&charbuf,1); assert_perror(errno); printf("ssize=%zd\n",ssize); assert(ssize==0); // puts("recv ok"); puts("read ok"); errno=0; ssize=send(fd,&charbuf,1,0); // ssize=write(fd,&charbuf,1); assert_perror(errno); assert(ssize==1); puts("send ok"); // puts("write ok"); if (piped) puts("SIGPIPE"); return 0; }