void run() { pid_t pid; int i; struct sembuf inc[2] = {{0, a_size/2, 0}, {1, a_size/2, 0}}; x_semop(semid, &inc[0], 1); for(i = 0; i < a_size/2; i++) { pid = x_fork(); if(ISCHILD(pid)) { run_comparator(i, cascades); exit(0); } } i = 0; while(13) { x_semop(semid, &swait[i%2], 1); x_semop(semid, &inc[(i + 1)%2], 1); i++; if(cascades == i) { break; } } }
int daemon_init(const char *pname, int facility) { int i; pid_t pid; if ( (pid = x_fork()) < 0) return (-1); else if (pid) _exit(0); /* parent terminates */ /* child 1 continues... */ if (setsid() < 0) /* become session leader */ return (-1); Signal(SIGHUP, SIG_IGN); if ( (pid = x_fork()) < 0) return (-1); else if (pid) _exit(0); /* child 1 terminates */ /* child 2 continues... */ daemon_proc = 1; /* for err_XXX() functions */ chdir("/"); /* change working directory */ /* close off file descriptors */ for (i = 0; i < MAXFD; i++) close(i); /* redirect stdin , stdout , and stderr to .dev/null */ open("/dev/null", O_RDONLY); open("/dev/null", O_RDWR); open("/dev/null", O_RDWR); openlog(pname, LOG_PID, facility); return (0); /* sucess */ }
void run_test() { int n; pid_t pid; n = NUM_PROC; while(n-- > 0) { pid = x_fork(); if(IS_CHILD(pid)) { // do something; test_routine(); exit(0); } } n = NUM_PROC; while(n-- > 0) { pid = x_wait(NULL); //printf("Done: %d\n", pid); } }
int main(void) { int in[2]; int out[2]; pid_t pid; printf("type 'quit' for exit\n\n"); x_pipe(in); x_pipe(out); pid = x_fork(); if(IS_CHILD(pid)) { x_dup2(in[READ], STDIN_FD); x_dup2(out[WRITE], STDOUT_FD); x_close(in[READ]); x_close(in[WRITE]); x_close(out[READ]); x_close(out[WRITE]); execl("/usr/bin/bc", "runbc", NULL); perror("execl"); exit(1); } else if(IS_PARENT(pid)) { char buf[BUFSIZE + 1]; fd_set rfds; int count; int flag = 1; x_close(in[READ]); x_close(out[WRITE]); while(13) { FD_ZERO(&rfds); FD_SET(STDIN_FD, &rfds); FD_SET(out[READ], &rfds); count = 0; x_select(out[READ] + 1, &rfds, NULL, NULL, NULL); if(FD_ISSET(out[READ], &rfds)) { // read messages from BC count = x_read(out[READ], buf, BUFSIZE); if(count) { x_write(STDOUT_FD, buf, count); } else { break; } } if(FD_ISSET(STDIN_FD, &rfds) && flag) { // send commands to BC count = x_read(STDIN_FD, buf, BUFSIZE); if(count) { x_write(in[WRITE], buf, count); } else { x_write(in[WRITE], "quit\n", 6); flag = 0; } } } x_waitpid(pid, NULL, 0); x_close(in[WRITE]); x_close(out[READ]); } return 0; }