4 //#define _SIMPLE_SLAVE
20 #include <sys/types.h>
22 #include <sys/socket.h>
23 #include <netinet/tcp.h>
32 void Slave_main(Options * o)
40 freopen(SLAVE_LOGFILE, "w", stderr);
42 slave = (Slave*)(calloc(o->nCPU, sizeof(Slave)));
46 net_fd = Network_client("localhost", o->port,100);
48 net_fd = Network_client(o->master_addr, o->port,100);
50 FILE * f = fdopen(net_fd, "w"); setbuf(f, NULL);
51 fprintf(f, "%d\n", o->nCPU);
53 log_print(2, "Slave_main", "Waiting on bell from master");
55 if (read(net_fd, &c, sizeof(char)) == 0 || c != '\a')
56 error("Slave_main", "Didn't get bell from master");
61 log_print(2, "Slave_main", "Got bell from master");
63 for (int i = 0; i < o->nCPU; ++i)
70 if (read(net_fd, &c, sizeof(char)) == 0 || c != '\a')
71 error("Slave_main", "Didn't get bell from master authorising connection of slave %d", i);
74 log_print(3, "Slave_main", "Connecting slave %d to port %d at time %d", i, o->port+i+1, time(NULL));
76 new_fd = Network_client("localhost", o->port+i+1, 100);
78 new_fd = Network_client(o->master_addr, o->port+i+1, 100);
84 slave[i].in = new_fd; slave[i].out = new_fd;
86 slave[i].pid = fork();
87 if (slave[i].pid == 0)
89 dup2(slave[i].in, fileno(stdin));
90 dup2(slave[i].out, fileno(stdout));
91 execlp(o->shell, o->shell, NULL);
101 void Slave_loop(Options * o)
104 int p = -1; int s = 0;
108 p = waitpid(-1, &s, 0);
111 log_print(0, "Slave_loop", "waitpid : %s", strerror(errno));
114 if (s != SHELL_EXIT_CODE)
116 // there was an error
119 for (i = 0; i < o->nCPU; ++i)
121 if (slave[i].pid == p) break;
124 error("Slave_loop", "No child matches pid %d", p);
126 log_print(0, "Slave_loop", "Child [%d] exits with status %d; restarting", p, s);
127 slave[i].pid = fork();
128 if (slave[i].pid == 0)
130 dup2(slave[i].in, fileno(stdin));
131 dup2(slave[i].out, fileno(stdout));
132 execlp(o->shell, o->shell, NULL);
135 char buffer[] = "\f\a\a\a";
136 if (write(slave[i].in, buffer, strlen(buffer)) <= 0)
137 log_print(0, "Slave_loop", "Slave %d input closed", i);