From: "Michael Kerrisk" <mtk-lkml@gmx.net>
To: Roland McGrath <roland@redhat.com>
Cc: torvalds@osdl.org, akpm@osdl.org, drepper@redhat.com,
linux-kernel@vger.kernel.org, michael.kerrisk@gmx.net
Subject: Re: [PATCH] waitid system call
Date: Thu, 19 Aug 2004 19:20:16 +0200 (MEST) [thread overview]
Message-ID: <19958.1092936016@www27.gmx.net> (raw)
In-Reply-To: 200408162112.i7GLCqTB030682@magilla.sf.frob.com
Roland,
> > Precisely what kernel version was the patch against?
>
> It is against 2.6.8.1.
>
> > I've (twice) tried applying the patch against 2.6.8.1 and building the
> > kernel. The build succeeds, but I am running into a strange kernel
panic
> > ("Unable to mount root fs") when I try to boot the resulting kernel.
> > (Compiling and booting 2.6.8.1 on the same x86 machine works fine.)
>
> Well, it sure works fine for me. Unless someone else can reproduce your
> issue, you'll have to look into it yourself. I don't discount the
> likelihood it's a bug caused by my patch, but such an error is so far
> afield that there is no way for me to guess at what you might be seeing.
Yes, I assumed it would work for you ;-). Sorry, I applied 2.6.8*
against an existing (near vanilla) 2.6.7 tree in which I didn't
realise I'd tweaked some file system support stuff. I've now
built against a truly vanilla 2.6.8.1 and it builds and boots
fine.
I've tested out various things (see below for a summary), and
all seems well, with one possible doubt. How can one
distinguish "no children to wait for case" and the "child
successfully waited for case" when using WNOHANG? SUSv3 is a
bit silent on this point, but the Solaris man page helpfully
says:
If WNOHANG was used, 0 can be returned (indicating
no error); however, no children may have changed state if
info->si_pid is 0.
And testing (program below), shows that this is indeed what
happens on Solaris 8. As things stand, this doesn't seem
to happen with your patch for Linux -- it would perhaps be nice
if it did. Here's what I see when I run the test program at the
end of this message (here, the command requests options as
WSTOPPED|WEXITED|WCONTINUED|WNOHANG, and creates two children
each of which for the specified number of seconds);
$ ./waitid_test secH 1 2
child 1 PID=28443 started
child 2 PID=28444 started
0: waitid() returned 0
si_pid=1073838904; si_uid=-1073746612; si_status=1
si_code=1073838488 (????); si_signo=-1073746624;
1: waitid() returned 0
si_pid=1073838904; si_uid=-1073746612; si_status=1
si_code=1073838488 (????); si_signo=-1073746624;
child 1 PID=28443 finished
1: waitid() returned 0
si_pid=28443; si_uid=500; si_status=0
si_code=1 (CLD_EXITED); si_signo=17;
2: waitid() returned 0
si_pid=28443; si_uid=500; si_status=0
si_code=1 (CLD_EXITED); si_signo=17;
child 2 PID=28444 finished
2: waitid() returned 0
si_pid=28444; si_uid=500; si_status=0
si_code=1 (CLD_EXITED); si_signo=17;
waitid: No child processes
On Solaris 8, the 1st, 2nd, and 4th waitid() calls
return si_pid == 0.
Cheers,
Michael
OTHER TESTS (all successful)
===========
1. WSTOPPED
tested by sending SIGSTOP to child -- WORKS
info.si_signo set to 17 (SIGCHLD)
info.so_pid set to PID of child
info.si_uid set to UID of child
info.si_status set to 0x13 (signalled 19, SIGSTOP)
info.si_code set to 5 (CLD_STOPPED)
tested by sending SIGTSTP to child -- WORKS
info.si_signo set to 17 (SIGCHLD)
info.so_pid set to PID of child
info.si_uid set to UID of child
info.si_status set to 0x14 (signalled 20, SIGTSTP)
info.si_code set to 5 (CLD_STOPPED)
2. WCONTINUED -- WORKS
info.si_signo set to 17 (SIGCHLD)
info.so_pid set to PID of child
info.si_uid set to UID of child
info.si_status set to 0x12 (signalled 18, SIGCONT)
info.si_code set to 6 (CLD_CONTINUED)
3. WEXITED
tested termination by signal SIGKILL -- WORKS
info.si_signo set to 17 (SIGCHLD)
info.so_pid set to PID of child
info.si_uid set to UID of child
info.si_status set to 0x9 (signalled 9, SIGKILL)
info.si_code set to 2 (CLD_KILLED)
tested for normal process termination (exit(0)) - WORKS
info.si_signo set to 17 (SIGCHLD)
info.so_pid set to PID of child
info.si_uid set to UID of child
info.si_status set to 0x0 (exited, status 0)
info.si_code set to 1 (CLD_EXITED)
tested for normal process termination (exit(1)) - WORKS
info.si_signo set to 17 (SIGCHLD)
info.so_pid set to PID of child
info.si_uid set to UID of child
info.si_status set to 0x1 (exited, status 1)
info.si_code set to 1 (CLD_EXITED)
4. Waiting for combinations of WCONTINUED, WEXITED, WSTOPPED: works
5. Waiting for one of WCONTINUED, WEXITED, WSTOPPED while child
undergoes a state transition in another category
(e.g., waiting for WEXITED and child is stopped by a signal)
WORKS (waitid() remains blocked)
6. WNOWAIT -- leaves child in waitable state -- WORKS
Tested for WCONTINUED, WEXITED (normal and abnormal termination),
and WSTOPPED transitions
7. Create multiple process groups; select of child by process
group (idtype == P_PGID) -- WORKS
8. Selection of one child out of several by PID
(idtype == P_PID) WORKS
9. Selection of any child (idtype == P_ALL) -- WORKS
10. No child - WORKS (returns errno set to ECHILD)
TEXT PROGRAM
============
/* waitid_test.c
Michael Kerrisk, Aug 2004
*/
#include <sys/types.h>
#include <sys/wait.h>
#include <time.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#define errMsg(msg) { perror(msg); }
#define errExit(msg) { perror(msg); exit(EXIT_FAILURE); }
#ifdef __linux__
#include <syscall.h>
#define __NR_waitid 284 /* Syscall number on x86 */
_syscall4(int, waitid, idtype_t, __idtype, __id_t, __id,
siginfo_t *, __infop, int, __options)
#define WSTOPPED WUNTRACED
#define WEXITED 0x00000004
#define WCONTINUED 0x00000008
#define WNOWAIT 0x01000000
#endif
static void
child(int cnum, int nsecs)
{
printf("child %d PID=%ld started\n", cnum, (long) getpid());
sleep(nsecs);
printf("child %d PID=%ld finished\n", cnum, (long) getpid());
} /* child */
int
main(int argc, char *argv[])
{
siginfo_t info;
int options, j, s;
char *p;
time_t start;
start = time(NULL);
if (argc < 3) {
fprintf(stderr, "%s {escnW} child-secs...\n", argv[0]);
exit(EXIT_FAILURE);
}
options = 0;
for (p = argv[1]; *p != '\0'; p++) {
if (*p == 'e') options |= WEXITED;
else if (*p == 's') options |= WSTOPPED;
else if (*p == 'c') options |= WCONTINUED;
else if (*p == 'H') options |= WNOHANG;
else if (*p == 'W') options |= WNOWAIT;
}
for (j = 2; j < argc; j++) {
switch (fork()) {
case -1:
errExit("fork");
case 0:
child(j - 1, atoi(argv[j]));
exit(EXIT_SUCCESS);
default:
break;
}
}
for (;;) {
s = waitid(P_ALL, 0, &info, options);
if (s == -1)
errExit("waitid");
printf("%3ld: waitid() returned %d\n",
(long) (time(NULL) - start), s);
printf(" si_pid=%ld; ", (long) info.si_pid);
printf("si_uid=%ld; ", (long) info.si_uid);
printf("si_status=%ld\n", (long) info.si_status);
printf(" si_code=%ld ", (long) info.si_code);
printf(" (%s); ",
(info.si_code == CLD_EXITED) ? "CLD_EXITED" :
(info.si_code == CLD_KILLED) ? "CLD_KILLED" :
(info.si_code == CLD_DUMPED) ? "CLD_DUMPED" :
(info.si_code == CLD_TRAPPED) ? "CLD_TRAPPED" :
(info.si_code == CLD_STOPPED) ? "CLD_STOPPED" :
(info.si_code == CLD_CONTINUED) ? "CLD_CONTINUED" :
"????"
);
printf("si_signo=%ld;\n", (long) info.si_signo);
if ((options & WNOHANG) != 0)
usleep(500000); /* Just slow things down a little */
}
} /* main */
--
NEU: Bis zu 10 GB Speicher für e-mails & Dateien!
1 GB bereits bei GMX FreeMail http://www.gmx.net/de/go/mail
next prev parent reply other threads:[~2004-08-19 17:21 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-08-15 23:03 [PATCH] waitid system call Roland McGrath
2004-08-16 5:40 ` Roland McGrath
2004-08-16 17:15 ` Michael Kerrisk
2004-08-16 21:12 ` Roland McGrath
2004-08-19 17:20 ` Michael Kerrisk [this message]
2004-08-19 20:53 ` Roland McGrath
2004-08-20 6:00 ` Michael Kerrisk
2004-08-20 9:02 ` Michael Kerrisk
2004-08-20 20:04 ` Roland McGrath
2004-08-24 11:51 ` Michael Kerrisk
2004-08-31 6:04 ` Roland McGrath
2004-08-31 6:26 ` Jakub Jelinek
2004-08-31 6:37 ` Roland McGrath
2004-08-31 6:40 ` Andrew Morton
2004-08-31 15:53 ` Bill Davidsen
2004-08-31 18:26 ` Linus Torvalds
2004-08-31 23:51 ` Roland McGrath
2004-09-01 11:31 ` Michael Kerrisk
2004-08-31 7:22 ` Michael Kerrisk
2004-08-22 8:53 ` Tonnerre
[not found] <2tCiy-8pK-13@gated-at.bofh.it>
2004-08-16 0:03 ` Andi Kleen
2004-08-16 2:10 ` Roland McGrath
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=19958.1092936016@www27.gmx.net \
--to=mtk-lkml@gmx.net \
--cc=akpm@osdl.org \
--cc=drepper@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=michael.kerrisk@gmx.net \
--cc=roland@redhat.com \
--cc=torvalds@osdl.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.