xref: /freebsd/tools/test/stress2/misc/pdfork.sh (revision 02e9120893770924227138ba49df1edb3896112a)
1#!/bin/sh
2
3# truss / pdfork regression test.
4# Test scenario by: Ryan Stone rstone@, slightly mangled by pho@
5
6# Interruptable hang seen:
7# $ ps -lp992
8#  UID PID PPID CPU PRI NI  VSZ  RSS MWCHAN STAT TT     TIME COMMAND
9# 1001 992  991   0  27  0 4168 1908 -      TX+   0  0:00.00 /tmp/pdfork -p
10# $
11
12cat > /tmp/pdfork.c <<EOF
13#include <sys/types.h>
14#include <sys/procdesc.h>
15#include <sys/resource.h>
16#include <sys/time.h>
17#include <sys/wait.h>
18#include <err.h>
19#include <stdlib.h>
20#include <stdio.h>
21#include <string.h>
22#include <unistd.h>
23
24int
25main(int argc, char **argv)
26{
27	pid_t pid;
28	int fd;
29
30	if (argc > 1 && strcmp(argv[1], "-p") == 0) {
31		pid = pdfork(&fd, 0);
32	} else {
33		pid = fork();
34	}
35
36	if (pid == 0) {
37		sleep(1);
38		exit(0);
39	} else if (pid < 0) {
40		err(1, "fork() failed");
41	} else {
42		int status = 0;
43		if (argc > 1 && strcmp(argv[1], "-p") != 0) {
44			int error = wait4(pid, &status, WEXITED, NULL);
45			if (error < 0)
46				err(1, "wait4 failed");
47		}
48		exit(status);
49	}
50}
51EOF
52cc -o /tmp/pdfork -Wall -Wextra -O2 /tmp/pdfork.c || exit 1
53
54timeout 20s truss -f /tmp/pdfork    2> /dev/null; s1=$?
55timeout 20s truss -f /tmp/pdfork -p 2> /dev/null; s2=$?
56
57rm -f /tmp/pdfork /tmp/pdfork.c
58return $((s1 + s2))
59