#define _DEBUG #include #include #include #include #include #include #include #include #include #include #include /* Obtain O_* constant definitions */ #include #include #include #include int main(int argc, char *argv[]) { int wr_fds[2] = { -1, -1 }; int rd_fds[2] = { -1, -1 }; int status; int res = pipe(rd_fds); assert(res != -1); res = pipe(wr_fds); assert(res != -1); fcntl(wr_fds[0], F_SETPIPE_SZ, sizeof(int)); fcntl(wr_fds[1], F_SETPIPE_SZ, sizeof(int)); fcntl(rd_fds[0], F_SETPIPE_SZ, sizeof(int)); fcntl(rd_fds[1], F_SETPIPE_SZ, sizeof(int)); int count = atoi(argv[1]); int delay = atoi(argv[2]); pid_t ppid = fork(); if (ppid) { sigset_t mask; sigfillset(&mask); sigprocmask(SIG_BLOCK, &mask, NULL); close(wr_fds[0]); close(rd_fds[1]); fprintf(stderr, "%s: STARTED\n", __FUNCTION__); while (--count) { if (waitpid(ppid, &status, WNOHANG)) break; int cmd = count % 2; if (write(wr_fds[1], &cmd, sizeof(cmd)) < 0) break; printf("%s: sent %d\n", __FUNCTION__, cmd); if (read(rd_fds[0], &cmd, sizeof(cmd)) < 0) break; printf("%s: ack %d\n", __FUNCTION__, cmd); usleep(delay * 1000); } fprintf(stderr, "%s: FINISHED\n", __FUNCTION__); wait(&status); return 0; } else { // // test 10 1000 perf stat -cmd-fd 1 --cmd-ack-fd 2 -vvv .... // wr_fds[0] == cmd-fd close(wr_fds[1]); // rd_fds[1] == cmd-ack-fd close(rd_fds[0]); std::vector new_argv; new_argv.push_back(argv[3]); // perfstat new_argv.push_back(argv[4]); // stat std::vector buff(64, '\0'); new_argv.push_back("--cmd-fd"); snprintf(&buff[0], 64, "%d", wr_fds[0]); new_argv.push_back(&buff[0]); std::vector buff2(64, '\0'); new_argv.push_back("--cmd-ack-fd"); snprintf(&buff2[0], 64, "%d", rd_fds[1]); new_argv.push_back(&buff2[0]); int i = 5; for (; argv[i]; i++) new_argv.push_back(argv[i]); new_argv.push_back(NULL); execv(argv[3], &new_argv[0]); } }