1*63d75641SMichał Górny #include <sys/types.h> 2*63d75641SMichał Górny #include <sys/wait.h> 3*63d75641SMichał Górny #include <assert.h> 4*63d75641SMichał Górny #if defined(TEST_CLONE) 5*63d75641SMichał Górny #include <sched.h> 6*63d75641SMichał Górny #endif 7*63d75641SMichał Górny #include <stdint.h> 8*63d75641SMichał Górny #include <stdio.h> 9*63d75641SMichał Górny #include <unistd.h> 10*63d75641SMichał Górny 11*63d75641SMichał Górny int g_val = 0; 12*63d75641SMichał Górny 13*63d75641SMichał Górny void parent_func() { 14*63d75641SMichał Górny g_val = 1; 15*63d75641SMichał Górny printf("function run in parent\n"); 16*63d75641SMichał Górny } 17*63d75641SMichał Górny 18*63d75641SMichał Górny int child_func(void *unused) { 19*63d75641SMichał Górny // we need to avoid memory modifications for vfork(), yet we want 20*63d75641SMichał Górny // to be able to test watchpoints, so do the next best thing 21*63d75641SMichał Górny // and restore the original value 22*63d75641SMichał Górny g_val = 2; 23*63d75641SMichał Górny g_val = 0; 24*63d75641SMichał Górny return 0; 25*63d75641SMichał Górny } 26*63d75641SMichał Górny 27*63d75641SMichał Górny int main() { 28*63d75641SMichał Górny alignas(uintmax_t) char stack[4096]; 29*63d75641SMichał Górny 30*63d75641SMichał Górny #if defined(TEST_CLONE) 31*63d75641SMichał Górny pid_t pid = clone(child_func, &stack[sizeof(stack)], 0, NULL); 32*63d75641SMichał Górny #elif defined(TEST_FORK) 33*63d75641SMichał Górny pid_t pid = TEST_FORK(); 34*63d75641SMichał Górny if (pid == 0) 35*63d75641SMichał Górny _exit(child_func(NULL)); 36*63d75641SMichał Górny #endif 37*63d75641SMichał Górny assert(pid != -1); 38*63d75641SMichał Górny 39*63d75641SMichał Górny parent_func(); 40*63d75641SMichał Górny int status, wait_flags = 0; 41*63d75641SMichał Górny #if defined(TEST_CLONE) 42*63d75641SMichał Górny wait_flags = __WALL; 43*63d75641SMichał Górny #endif 44*63d75641SMichał Górny pid_t waited = waitpid(pid, &status, wait_flags); 45*63d75641SMichał Górny assert(waited == pid); 46*63d75641SMichał Górny assert(WIFEXITED(status)); 47*63d75641SMichał Górny printf("child exited: %d\n", WEXITSTATUS(status)); 48*63d75641SMichał Górny 49*63d75641SMichał Górny return 0; 50*63d75641SMichał Górny } 51