void read_and_print(int pos) { struct node a; read_node(pos, &a); if (a.right_idx) { read_and_print(a.right_idx); } printf("%d ", a.key); if (a.left_idx) read_and_print(a.left_idx); }
int main(int argc, char *argv[]) { fd = open(argv[1], O_RDONLY); read_and_print(0); close(fd); fclose(stdout); return 0; }
int main(int argc, char *argv[]) { if(argc == 1){ fprintf(stderr, "Usage: %s command...\n", *argv); return 1; } enum { read_i = 0, write_i = 1 }; int child_err[2], child_out[2]; check(pipe(child_err), "pipe"); check(pipe(child_out), "pipe"); long pid = fork(); check(pid, "fork"); if(pid == 0){ close(child_out[read_i]); close(child_err[read_i]); check(dup2(child_out[write_i], 1), "dup2"); check(dup2(child_err[write_i], 2), "dup2"); close(child_out[write_i]); close(child_err[write_i]); execvp(argv[1], argv + 1); check(-1, "exec"); } close(child_err[write_i]); close(child_out[write_i]); for(;;){ fd_set fds; FD_ZERO(&fds); if(child_out[read_i] == -1 && child_err[read_i] == -1) { break; } int maxfd = 0; if(child_out[read_i] != -1){ FD_SET(child_out[read_i], &fds); maxfd = child_out[read_i]; } if(child_err[read_i] != -1){ FD_SET(child_err[read_i], &fds); if(child_err[read_i] > maxfd) maxfd = child_err[read_i]; } check(select(maxfd + 1, &fds, NULL, NULL, NULL), "select"); if(FD_ISSET(child_out[read_i], &fds)){ read_and_print(&child_out[read_i], "\x1b[1;34m"); } if(FD_ISSET(child_err[read_i], &fds)){ read_and_print(&child_err[read_i], "\x1b[1;35m"); } } return 0; }