From: Steve Beaty <beaty@emess.mscd.edu>
To: linux-kernel@vger.kernel.org
Subject: sigaction, fork, malloc, and futex
Date: Tue, 4 May 2004 14:15:37 -0600 (MDT) [thread overview]
Message-ID: <200405042015.i44KFb0R001900@emess.mscd.edu> (raw)
anyone have a clue on this one? we set up a signal handler, create
a child that sends that signal, and have the signal handler fork
another child. if there is a malloc(), the second child gets stuck
in a futex(); without the malloc(), no problem. 2.4.20-30.9
kernel. straces at the end. any help would be appreciated.
thanks!
===========================================================================
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
/* comment out the following to show the problem */
#define WORKS
void sig_handler (int signum)
{
int child;
fprintf (stderr, "Process %d received a SIGALRM signal\n", getpid());
if ((child = fork ()) == 0)
{
fprintf (stderr, "%d exiting\n", getpid());
exit (0);
}
fprintf (stderr, "%d waiting for %d\n", getpid(), child);
waitpid (child, NULL, 0);
}
int
main (int argc, char **argv)
{
int parent = getpid();
int child;
struct sigaction action;
sigemptyset (&action.sa_mask);
action.sa_handler = sig_handler;
#ifndef WORKS
malloc (sizeof (int));
#endif
assert (sigaction (SIGALRM, &action, NULL) == 0);
if ((child = fork ()) == 0)
{
fprintf (stderr, "%d sending SIGALRM to %d\n", getpid(), parent);
if (kill (parent, SIGALRM) == -1) perror ("kill 1");
fprintf (stderr, "%d exiting\n", getpid());
exit (0);
}
fprintf (stderr, "%d waiting for %d\n", getpid(), child);
waitpid (child, NULL, 0);
}
/*
** if WORKS defined:
$ ./a.out
9106 sending SIGALRM to 9105
9106 exiting
Process 9105 received a SIGALRM signal
9107 exiting
9105 waiting for 9107
9105 waiting for 9106
** if WORKS undefined:
$ ./a.out
9095 sending SIGALRM to 9094
9095 exiting
Process 9094 received a SIGALRM signal
$ sh /usr/src/linux-2.4.20-30.9/scripts/ver_linux
If some fields are empty or look unusual you may have an old version.
Compare to the current minimal requirements in Documentation/Changes.
Linux emess0.mscd.edu 2.4.20-30.9 #1 Wed Feb 4 20:44:26 EST 2004 i686 i686
i386 GNU/Linux
Gnu C 3.2.2
Gnu make 3.79.1
util-linux 2.11y
mount 2.11y
modutils 2.4.22
e2fsprogs 1.32
jfsutils 1.0.17
reiserfsprogs 3.6.4
pcmcia-cs 3.1.31
PPP 2.4.1
isdn4k-utils 3.1pre4
Linux C Library 2.3.2
Dynamic linker (ldd) 2.3.2
Procps 2.0.11
Net-tools 1.60
Kbd 1.08
Sh-utils 4.5.3
Modules Loaded ieee1394 ide-cd cdrom i810_audio ac97_codec
soundcore mga agpgart binfmt_misc autofs e100 ipchains loop lvm-mod keybdev
mousedev hid input usb-uhci usbcore ext3 jbd
*/
#if 0
BAD:
---------------------------------------------------------------------------
$ strace ./a.out
execve("./a.out", ["./a.out"], [/* 42 vars */]) = 0
uname({sys="Linux", node="emess.mscd.edu", ...}) = 0
brk(0) = 0x80499fc
open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or
directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=105716, ...}) = 0
old_mmap(NULL, 105716, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40016000
close(3) = 0
open("/lib/tls/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\360W\1"..., 512) =
512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1539996, ...}) = 0
old_mmap(0x42000000, 1267276, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) =
0x42000000
old_mmap(0x42130000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
0x130000) = 0x42130000
old_mmap(0x42133000, 9804, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x42133000
close(3) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0x40030000
set_thread_area({entry_number:-1 -> 6, base_addr:0x400304a0, limit:1048575,
seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1,
seg_not_present:0, useable:1}) = 0
munmap(0x40016000, 105716) = 0
getpid() = 9059
brk(0) = 0x80499fc
brk(0x804a9fc) = 0x804a9fc
brk(0) = 0x804a9fc
brk(0x804b000) = 0x804b000
rt_sigaction(SIGALRM, {0x8048568, [],
SA_RESTORER|SA_NOMASK|SA_SIGINFO|0x21328d0, 0x420277b0}, NULL, 8) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|0x11,
<ignored>, <ignored>, 0x400304e8) = 9060
9060 sending SIGALRM to 9059
9060 exiting
--- SIGALRM (Alarm clock) @ 0 (0) ---
getpid() = 9059
--- SIGCHLD (Child exited) @ 0 (0) ---
write(2, "Process 9059 received a SIGALRM "..., 39Process 9059 received a
SIGALRM signal
) = 39
futex(0x421336d0, FUTEX_WAIT, 2, NULL
[control-c]
---------------------------------------------------------------------------
GOOD
---------------------------------------------------------------------------
$ strace ./a.out
execve("./a.out", ["./a.out"], [/* 42 vars */]) = 0
uname({sys="Linux", node="emess.mscd.edu", ...}) = 0
brk(0) = 0x80499b8
open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or
directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=105716, ...}) = 0
old_mmap(NULL, 105716, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40016000
close(3) = 0
open("/lib/tls/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\360W\1"..., 512) =
512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1539996, ...}) = 0
old_mmap(0x42000000, 1267276, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) =
0x42000000
old_mmap(0x42130000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3,
0x130000) = 0x42130000
old_mmap(0x42133000, 9804, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x42133000
close(3) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0x40030000
set_thread_area({entry_number:-1 -> 6, base_addr:0x400304a0, limit:1048575,
seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1,
seg_not_present:0, useable:1}) = 0
munmap(0x40016000, 105716) = 0
getpid() = 9087
rt_sigaction(SIGALRM, {0x8048534, [],
SA_RESTORER|SA_NOMASK|SA_SIGINFO|0x21328d0, 0x420277b0}, NULL, 8) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|0x11,
<ignored>, <ignored>, 0x400304e8) = 9088
9088 sending SIGALRM to 9087
9088 exiting
--- SIGALRM (Alarm clock) @ 0 (0) ---
getpid() = 9087
--- SIGCHLD (Child exited) @ 0 (0) ---
write(2, "Process 9087 received a SIGALRM "..., 39Process 9087 received a
SIGALRM signal
) = 39
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|0x11,
<ignored>, <ignored>, 0x400304e8) = 9089
getpid() = 9087
write(2, "9087 waiting for 9089\n", 229087 waiting for 9089
) = 22
wait4(9089, 9089 exiting
NULL, 0, NULL) = 9089
rt_sigreturn(0x1200011) = 9088
getpid() = 9087
write(2, "9087 waiting for 9088\n", 229087 waiting for 9088
) = 22
wait4(9088, NULL, 0, NULL) = 9088
exit_group(0) = ?
---------------------------------------------------------------------------
#endif
===========================================================================
--
Dr. Steve Beaty (B80) Associate Professor
Metro State College of Denver beaty@emess.mscd.edu
VOX: (303) 556-5321 Science Building 134C
FAX: (303) 556-5381 http://clem.mscd.edu/~beatys/
next reply other threads:[~2004-05-04 20:15 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-05-04 20:15 Steve Beaty [this message]
2004-05-04 22:30 ` sigaction, fork, malloc, and futex chris
2004-05-04 22:56 ` Zan Lynx
2004-05-04 23:16 ` Andreas Schwab
2004-05-06 21:37 ` Steve Beaty
2004-05-06 22:22 ` Zan Lynx
2004-05-06 21:36 ` Steve Beaty
2004-05-04 23:37 ` Richard B. Johnson
2004-05-06 21:41 ` Steve Beaty
2004-05-05 0:38 ` Edgar Toernig
2004-05-06 21:47 ` Steve Beaty
[not found] <1SeIE-Dy-17@gated-at.bofh.it>
[not found] ` <1ShG9-2Yt-11@gated-at.bofh.it>
2004-05-04 23:57 ` Pascal Schmidt
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=200405042015.i44KFb0R001900@emess.mscd.edu \
--to=beaty@emess.mscd.edu \
--cc=linux-kernel@vger.kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox