Added the last of the companion fibo test apps (based on fork/exec - this is just
another test that doesn't work on BeOS, dunno why, but who cares...). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19767 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -5,7 +5,7 @@ UseHeaders $(TARGET_PRIVATE_KERNEL_HEADERS) : true ;
|
||||
|
||||
SimpleTest fibo_load_image : fibo_load_image.cpp ;
|
||||
SimpleTest fibo_fork : fibo_fork.cpp ;
|
||||
#SimpleTest fibo_exec : fibo_exec.cpp ;
|
||||
SimpleTest fibo_exec : fibo_exec.cpp ;
|
||||
|
||||
SimpleTest port_close_test_1 : port_close_test_1.cpp ;
|
||||
SimpleTest port_close_test_2 : port_close_test_2.cpp ;
|
||||
|
||||
@@ -0,0 +1,103 @@
|
||||
/*
|
||||
* Copyright 2007, Axel Dörfler, [email protected]. All rights reserved.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*
|
||||
* Copyright 2002, Manuel J. Petit. All rights reserved.
|
||||
* Distributed under the terms of the NewOS License.
|
||||
*/
|
||||
|
||||
|
||||
#include <image.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
||||
static void
|
||||
usage(char const *app)
|
||||
{
|
||||
printf("usage: %s [-s] ###\n", app);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
bool silent = false;
|
||||
int num = 0;
|
||||
int result;
|
||||
|
||||
switch (argc) {
|
||||
case 2:
|
||||
num = atoi(argv[1]);
|
||||
break;
|
||||
case 3:
|
||||
if (!strcmp(argv[1], "-s")) {
|
||||
num = atoi(argv[2]);
|
||||
silent = true;
|
||||
break;
|
||||
}
|
||||
// supposed to fall through
|
||||
|
||||
default:
|
||||
usage(argv[0]);
|
||||
break;
|
||||
}
|
||||
|
||||
if (num < 2) {
|
||||
result = num;
|
||||
} else {
|
||||
pid_t childA = fork();
|
||||
if (childA == 0) {
|
||||
// we're the child
|
||||
char buffer[64];
|
||||
char* args[]= { argv[0], "-s", buffer, NULL };
|
||||
|
||||
snprintf(buffer, sizeof(buffer), "%d", num - 1);
|
||||
if (execv(args[0], args) < 0) {
|
||||
fprintf(stderr, "Could not create exec A: %s\n", strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
} else if (childA < 0) {
|
||||
fprintf(stderr, "fork() failed for child A: %s\n", strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
pid_t childB = fork();
|
||||
if (childB == 0) {
|
||||
// we're the child
|
||||
char buffer[64];
|
||||
char* args[]= { argv[0], "-s", buffer, NULL };
|
||||
|
||||
snprintf(buffer, sizeof(buffer), "%d", num - 2);
|
||||
if (execv(args[0], args) < 0) {
|
||||
fprintf(stderr, "Could not create exec B: %s\n", strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
} else if (childB < 0) {
|
||||
fprintf(stderr, "fork() failed for child B: %s\n", strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
status_t status;
|
||||
while (wait_for_thread(childA, &status) == B_INTERRUPTED)
|
||||
;
|
||||
result = status;
|
||||
|
||||
while (wait_for_thread(childB, &status) == B_INTERRUPTED)
|
||||
;
|
||||
result += status;
|
||||
}
|
||||
|
||||
if (silent) {
|
||||
return result;
|
||||
} else {
|
||||
printf("%d\n", result);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user