#include #include int dim = 6; int fdfork(int fd, int post) { static int seq; char path[64]; char buf[64]; int pfd, len; if(post){ int ch[2]; pipe(ch); len = snprint(path, sizeof path, "hcube.%d.%d", getpid(), seq++); pfd = create(path, OWRITE|ORCLOSE, 0666); if(pfd == -1) sysfatal("fdfork: create: %r"); snprint(buf, sizeof buf, "%d", ch[0]); if(write(pfd, buf, strlen(buf)) != strlen(buf)){ remove(path); sysfatal("fdfork: post '%s': %r", buf); } close(ch[0]); if(write(fd, path, len) != len){ remove(path); sysfatal("fdfork: write to peer: %r"); } len = read(fd, buf, sizeof buf-1); if(len <= 0){ remove(path); sysfatal("fdfork: read ack: %s from peer: %r", len == -1 ? "error" : "eof"); } buf[len] = '\0'; if(strcmp(path, buf)){ remove(path); print("ack from wrong peer: got '%s' want '%s'\n", buf, path); sysfatal("ack from wrong peer"); } close(pfd); //remove(path); return ch[1]; } else { len = read(fd, path, sizeof path-1); if(len <= 0) sysfatal("fdfork: read path: %s from peer: %r", len == -1 ? "error" : "eof"); path[len] = '\0'; pfd = open(path, OWRITE); if(pfd == -1) sysfatal("fdfork: open: %r"); if(write(fd, path, len) != len) sysfatal("fdfork: write ack to peer: %r"); return pfd; } } int hyperfork(int *fd, int id, int dim) { int chfd[dim]; int ch[2]; int i; for(i = 0; i < dim; i++) chfd[i] = fdfork(fd[i], (id & (1< 1) dim = strtol(argv[1], nil, 0); id = 0; chdir("/srv"); for(i = 0; i < dim; i++) id = hyperfork(fd, id, i); for(i = 0; i < dim; i++){ int tlen, rlen, len; tlen = snprint(buf, sizeof buf, "hello %d\n", id); write(fd[i], buf, tlen); rlen = read(fd[i], buf, sizeof buf-1); buf[rlen] = '\0'; len = snprint(buf2, sizeof buf2, "%d: %s", id, buf); //write(1, buf2, len); } for(i = 0; i < dim; i++) if((id & (1<