Add a test for wait4().
This commit is contained in:
@@ -3,5 +3,6 @@ SubDir HAIKU_TOP src tests libs bsd ;
|
|||||||
UseHeaders [ FDirName $(HAIKU_TOP) headers compatibility bsd ] : true ;
|
UseHeaders [ FDirName $(HAIKU_TOP) headers compatibility bsd ] : true ;
|
||||||
|
|
||||||
SimpleTest forkpty_test : forkpty.c : libbsd.so ;
|
SimpleTest forkpty_test : forkpty.c : libbsd.so ;
|
||||||
|
SimpleTest wait4_test : wait4_test.cpp : libbsd.so ;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,66 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2007, Axel Dörfler, [email protected]. 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;
|
||||||
|
}
|
||||||
|
|
||||||
Reference in New Issue
Block a user