Example #1
0
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
}
Example #2
0
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");
    }
}
Example #3
0
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");
}
Example #4
0
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);
}