#include #include int writeTillBlock(int fd) { int i = 0; char buf[1024]; memset(buf, 1, sizeof(buf)); while(i < 300){ if(write(fd, buf, sizeof(buf)) < 0) break; print("%d\n",i); ++i; } return i; } int continueOnAlarm(void *v, char *s) { if(strncmp(s, "alarm", 5) == 0) return 1; if(strncmp(s, "sys: write on closed pipe", 25) == 0) return 1; return 0; } void main(void) { int fds[2], res; char buf[1024]; pipe(fds); atnotify(continueOnAlarm, 1); alarm(10000); res = writeTillBlock(fds[0]); if(res < 256){ while(res > 1){ read(fds[1], buf, sizeof(buf)); --res; } if(write(fds[0], buf, sizeof(buf)) < 0){ print("FAIL: can't write after reads: %r\n"); exits("FAIL"); } print("PASS\n"); exits(nil); }else{ print("FAIL: written %d kb\n", res); exits("FAIL"); } }