From f07a214d96d23a755b33219c8d96145a6aa62e2a Mon Sep 17 00:00:00 2001 From: Sree Harsha Totakura Date: Sat, 8 Dec 2012 13:05:37 +0000 Subject: - replacing fork with exec --- src/testbed/gnunet_mpi_test.c | 76 +++++++++++++++++++++---------------------- 1 file changed, 37 insertions(+), 39 deletions(-) (limited to 'src/testbed/gnunet_mpi_test.c') diff --git a/src/testbed/gnunet_mpi_test.c b/src/testbed/gnunet_mpi_test.c index 1e1608228..85049abc2 100644 --- a/src/testbed/gnunet_mpi_test.c +++ b/src/testbed/gnunet_mpi_test.c @@ -12,8 +12,10 @@ int main (int argc, char *argv[]) { char *msg; char *filename; + struct GNUNET_OS_Process *proc; + unsigned long code; pid_t pid; - pid_t ppid; + enum GNUNET_OS_ProcessStatusType proc_status; int ntasks; int rank; int msg_size; @@ -21,11 +23,20 @@ int main (int argc, char *argv[]) ret = GNUNET_SYSERR; if (MPI_SUCCESS != MPI_Init (&argc, &argv)) + { + GNUNET_break (0); return 1; + } if (MPI_SUCCESS != MPI_Comm_size (MPI_COMM_WORLD, &ntasks)) + { + GNUNET_break (0); goto finalize; + } if (MPI_SUCCESS != MPI_Comm_rank (MPI_COMM_WORLD, &rank)) + { + GNUNET_break (0); goto finalize; + } pid = getpid(); (void) GNUNET_asprintf (&filename, "%d-%d.mpiout", (int) pid, rank); msg_size = GNUNET_asprintf (&msg, "My rank is: %d\n", rank); @@ -40,57 +51,44 @@ int main (int argc, char *argv[]) GNUNET_free (filename); GNUNET_free (msg); if (GNUNET_OK != ret) + { + GNUNET_break (0); goto finalize; + } ret = GNUNET_SYSERR; - ppid = pid; - pid = fork (); - if (-1 == pid) + proc = GNUNET_OS_start_process (GNUNET_NO, + GNUNET_OS_INHERIT_STD_ALL, + NULL, + NULL, + "uptime", NULL); + if (NULL == proc) { - GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "fork"); + printf ("Cannot exec\n"); goto finalize; } - if (0 == pid) + do { + (void) sleep (1); + ret = GNUNET_OS_process_status (proc, &proc_status, &code); + } while (GNUNET_NO == ret); + GNUNET_assert (GNUNET_NO != ret); + if (GNUNET_OK == ret) { - /* child code */ - pid = getpid (); - (void) GNUNET_asprintf (&filename, "%d-%d.mpiout", (int) pid, rank); - msg_size = GNUNET_asprintf (&msg, "Child of %d\n", (int) ppid); - printf ("%s", msg); - if (msg_size == GNUNET_DISK_fn_write (filename, - msg, msg_size, - GNUNET_DISK_PERM_USER_READ - | GNUNET_DISK_PERM_GROUP_READ - | GNUNET_DISK_PERM_USER_WRITE - | GNUNET_DISK_PERM_GROUP_WRITE)) - ret = GNUNET_OK; - GNUNET_free (filename); - GNUNET_free (msg); - return (GNUNET_OK == ret) ? 0 : 1; - } - else { - int status; - int childpid; - - childpid = waitpid (pid, &status, 0); - if (childpid != pid) + if (0 != code) { + LOG (GNUNET_ERROR_TYPE_WARNING, "Child terminated abnormally\n"); + ret = GNUNET_SYSERR; GNUNET_break (0); goto finalize; } - if (!WIFEXITED (status)) - { - GNUNET_break (0); - goto finalize; - } - if (0 != WEXITSTATUS (status)) - { - GNUNET_break (0); - } } - ret = GNUNET_OK; + else + GNUNET_break (0); finalize: (void) MPI_Finalize (); - return (GNUNET_OK == ret) ? 0 : 1; + if (GNUNET_OK == ret) + return 0; + printf ("Something went wrong\n"); + return 1; } -- cgit v1.2.3