int main(int argc, char *argv[]) { pid_t child; #ifdef USE_DYNAMO dynamorio_app_init(); dynamorio_app_start(); #endif if (argc < 2) { print("ERROR: not enough args\n"); return -1; } if (find_dynamo_library()) print("parent is running under DynamoRIO\n"); else print("parent is running natively\n"); child = fork(); if (child < 0) { perror("ERROR on fork"); } else if (child > 0) { pid_t result; result = waitpid(child, NULL, 0); assert(result == child); print("child has exited\n"); } else { int result; char *arg[3]; #if NULL_ENV char **env = NULL; #else char *env0 = "LD_LIBRARY_PATH=/bin:."; char *env[2]; env[0] = env0; env[1] = NULL; #endif arg[0] = argv[1]; arg[1] = "/fake/path/it_worked"; arg[2] = NULL; if (find_dynamo_library()) print("child is running under DynamoRIO\n"); else print("child is running natively\n"); result = execve("/bin/bogus_will_fail", arg, env); result = execve(argv[1], arg, env); if (result < 0) perror("ERROR in execve"); } #ifdef USE_DYNAMO dynamorio_app_stop(); dynamorio_app_exit(); #endif }
int main(int argc, char *argv[]) { pid_t child; if (argc < 2) { print("ERROR: not enough args\n"); return -1; } if (find_dynamo_library()) print("parent is running under DynamoRIO\n"); else print("parent is running natively\n"); child = fork(); if (child < 0) { perror("ERROR on fork"); } else if (child > 0) { pid_t result; print("parent waiting for child\n"); result = waitpid(child, NULL, 0); assert(result == child); print("child has exited\n"); } else { int result; const char *arg[3]; #if NULL_ENV const char **env = NULL; #else const char *env0 = "LD_LIBRARY_PATH=/bin:."; const char *env[3]; env[0] = env0; env[1] = "DYNAMORIO_OPTIONS=-bad_option i#1097"; env[2] = NULL; #endif arg[0] = argv[1]; arg[1] = "/fake/path/it_worked"; arg[2] = NULL; if (find_dynamo_library()) print("child is running under DynamoRIO\n"); else print("child is running natively\n"); result = execve("/bin/bogus_will_fail", (char **)arg, (char **)env); result = execve(argv[1], (char **)arg, (char **)env); if (result < 0) perror("ERROR in execve"); } }
int main(int argc, char **argv) { int n, sum = 0; int result; char *arg[5]; char **env = NULL; char carg[10], csum[10]; if (find_dynamo_library()) print("under DynamoRIO\n"); else print("natively\n"); //print("%d %s %s %s\n", argc, argv[0], argv[1], argv[2]); if (1 == argc) { // no args n = N; sum = 0; print("Sum(%d)\n", n); } else if (2 == argc) { // execve-rec 10 n = atoi(argv[1]); sum = 0; print("Sum(%d)\n", n); } else { assert(argc == 3); // execve-rec 9 10 n = atoi(argv[1]); sum = atoi(argv[2]); } if (0 == n) { print(" = %d\n", sum); exit(0); } sum+=n; n--; snprintf(carg, 10, "%d", n); snprintf(csum, 10, "%d", sum); arg[0] = argv[0]; arg[1] = carg; arg[2] = csum; arg[3] = NULL; #if 0 print("%d,%d\n", n, sum); print("execing %d %s %s=%s %s\n", 3, arg[0], carg, arg[1], arg[2]); #endif fflush(stdout); result = execve(arg[0], arg, env); if (result < 0) perror("ERROR in execve"); }
int main(int argc, char** argv) { pid_t child1, child2; int do_vfork = 1; //argc == 1; int n, sum = 0; int result; char *arg[5]; char **env = NULL; char carg[10], csum[10]; if (find_dynamo_library()) printf("rio\n"); else printf("native\n"); //printf("%d %s %s %s\n", argc, argv[0], argv[1], argv[2]); if (argc < 3) { // start calculation if (2 == argc) // vfork-fib 10 n = atoi(argv[1]); else n = N; printf("parent fib(%d)=%d\n", n, fib(n)); sum = 0; } else { assert(argc == 3); // vfork-fib fib 10 n = atoi(argv[2]); sum = 0; } pf("\tfib %d\n", n); if (n <= 1) { // base case pf("base case\n"); _exit(1); } // now spawn two children arg[0] = argv[0]; arg[1] = "fib"; arg[3] = NULL; if (do_vfork) { /* default */ pf("using vfork()\n"); child1 = vfork(); } else { pf("using fork()\n"); child1 = fork(); } if (child1 < 0) { perror("ERROR on fork"); } else if (child1 == 0) { snprintf(carg, 10, "%d", n-2); arg[2] = carg; #if 0 pf("execing %d %s %s=%s %s\n", 3, arg[0], carg, arg[1], arg[2]); #endif result = execve(arg[0], arg, env); if (result < 0) perror("ERROR in execve"); } else { pid_t result; int status; int children = 2; if (do_vfork) { /* default */ pf("second child using vfork()\n"); child2 = vfork(); } else { pf("second child using fork()\n"); child2 = fork(); } if (child2 < 0) { perror("ERROR on fork"); } else if (child2 == 0) { snprintf(carg, 10, "%d", n-1); arg[2] = carg; result = execve(arg[0], arg, env); if (result < 0) perror("ERROR in execve"); } while(children > 0) { pf("parent waiting for %d children\n", children); result = wait(&status); assert(result == child2 || result == child1); assert(WIFEXITED(status)); //printf("child %d has exited with status=%d %d\n", result, status, WEXITSTATUS(status)); sum+=WEXITSTATUS(status); if (children == 2 && result == child1) pf("first child before second\n"); else pf("second child before first\n"); children--; } #if 0 result = waitpid(child2, &status, 0); assert(result == child2); assert(WIFEXITED(status)); pf("child2 has exited with status=%d %d\n", status, WEXITSTATUS(status)); sum+=WEXITSTATUS(status); pf("parent waiting for child1 %d\n", child1); result = waitpid(child1, &status, 0); assert(result == child1); assert(WIFEXITED(status)); pf("child1 has exited with status=%d %d\n", status, WEXITSTATUS(status)); sum+=WEXITSTATUS(status); #endif } #ifdef DEBUG printf("\tfib(%d)=%d [%d] %s\n", n, sum, fib(n), sum == fib(n) ? "OK" : "BAD"); #else if (argc == 1) printf("\tfib(%d)=%d [%d] %s\n", n, sum, fib(n), sum == fib(n) ? "OK" : "BAD"); #endif _exit(sum); }