Opened 7 years ago
Last modified 6 years ago
#13546 closed bug
wait4() doesn't seem to work — at Initial Version
Reported by: | korli | Owned by: | nobody |
---|---|---|---|
Priority: | normal | Milestone: | Unscheduled |
Component: | System/libroot.so | Version: | R1/Development |
Keywords: | Cc: | ||
Blocked By: | Blocking: | ||
Platform: | All |
Description
Test program:
/* * Copyright 2007, Axel Dörfler, axeld@pinc-software.de. All rights reserved. * Distributed under the terms of the MIT License. */ #include <errno.h> #include <stdio.h> #include <string.h> #include <sys/resource.h> #define _BSD_SOURCE #include <sys/wait.h> #include <unistd.h> /*! wait() should wait only once. If any argument is given, waitpid() should return an error (and errno to ECHILD), since there is no child with that process group ID. */ int child2() { sleep(2); return 2; } //! exits before child 2 int child1() { setpgrp(); // put us into a new process group pid_t child = fork(); if (child == 0) return child2(); sleep(1); return 1; } int main(int argc, char** argv) { bool waitForGroup = argc > 1; pid_t child = fork(); if (child == 0) return child1(); struct rusage usage; pid_t pid; do { int childStatus = -1; pid = wait4(-1, &childStatus, 0, &usage); printf("wait4() returned %ld (%s), child status %d\n", pid, strerror(errno), childStatus); } while (pid >= 0); return 0; }
Haiku strace output
[ 581] _kern_image_relocated(0xf6d) (409 us) [ 581] _kern_set_area_protection(0x2cce, 0x5) = 0x00000000 No error (11 us) [ 581] _kern_set_area_protection(0x2cd0, 0x5) = 0x00000000 No error (10 us) [ 581] _kern_set_area_protection(0x2cd2, 0x5) = 0x00000000 No error (23 us) [ 581] _kern_get_system_info(0x72d84998) = 0x00000000 No error (7 us) [ 581] _kern_get_system_info(0x72d84798) = 0x00000000 No error (4 us) [ 581] _kern_reserve_address_range([0x18033000], 0x7, 0x48000000) = 0x00000000 No error (7 us) [ 581] _kern_create_area("heap", 0xc6b980, 0x1, 0x40000, 0x0, 0x33) = 0x00002cd6 (15 us) [ 581] _kern_fork() = 0x00000247 (241 us) [ 581] _kern_wait_for_child(0xffffffff, 0x0, 0x72d84b64) = 0x00000247 (999999 us) [ 581] --- Child exited (Child exited) --- [ 581] _kern_get_team_usage_info(0x247, 0x0, 0x72d84bb8, 0x10) = 0x80001103 Operation on invalid team (2 us) [ 581] _kern_read_stat(0x1, (nil), false, 0x72d83390, 0x58) = 0x00000000 No error (4 us) [ 581] _kern_ioctl(0x1, TCGETA, 0x72d83338, 0x20) = 0x00000000 No error (5 us) wait4() returned -1 (No error), child status 1 [ 581] _kern_write(0x1, 0xffffffffffffffff, 0x180571b0, 0x2f) = 0x0000002f (1379 us) [ 581] _kern_exit_team(0x0) (9 us)
Linux output
wait4() returned 22104 (Success), child status 256 wait4() returned 4294967295 (No child processes), child status -1
Note:
See TracTickets
for help on using tickets.