Date: Tue, 25 Nov 2008 12:24:04 GMT From: Roman <Roman.Gritsulyak@gmail.com> To: freebsd-gnats-submit@FreeBSD.org Subject: misc/129172: signals are not delivered always Message-ID: <200811251224.mAPCO4ta082741@www.freebsd.org> Resent-Message-ID: <200811251230.mAPCU9gb013002@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 129172 >Category: misc >Synopsis: signals are not delivered always >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Tue Nov 25 12:30:09 UTC 2008 >Closed-Date: >Last-Modified: >Originator: Roman >Release: 6.3-RELEASE FreeBSD 6.3-RELEASE >Organization: >Environment: FreeBSD host.myrtghost.ru 6.3-RELEASE FreeBSD 6.3-RELEASE #0: Wed Jan 16 01:43:02 UTC 2008 root@palmer.cse.buffalo.edu:/usr/obj/usr/src/sys/SMP amd64 >Description: Seems, that signals that had been set by sigaction, or just by signal are not robust. Child counts is 100 in following example. Just 39 childs in following test appeared. If we remove protection by semaphore, it was just about 17 signals catched. Under linux all 100 childs signals passed in signal handler, and worked fine for both tests. >How-To-Repeat: Compile sem kernel module and load it into the kernel. gcc3.4 used gcc sigsem3.c -o sigsem3 ./signal3 - not all signals processed. gcc sigsem2.c -o sigsem2 ./signal2 coredump obtained. gcc sigsem1.c -o sigsem1 ./signal1 sigsem3.c: ==cut==%<========== #include <stdio.h> #include <signal.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <stdlib.h> #include <semaphore.h> volatile int chld_count; sem_t asem; void handler(int sig) { pid_t pid; sem_wait(&asem); chld_count ++; pid = wait(NULL); printf("Pid %d exited. count: %d\n", pid, chld_count); sem_post(&asem); } int main(void) { int i; chld_count=0; struct sigaction sa; sem_init(&asem,0,1); signal(SIGCHLD, handler); sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; sa.sa_handler = handler; sigaction(SIGCHLD, &sa, NULL); for(i=0;i<100;i++) { int ret_val; ret_val=fork(); if(ret_val==-1) { perror("fork()"); } else if(!ret_val) { printf("in child;Child pid is %d\n", getpid()); exit(0); } else { printf("Parent pid is %d; child is %d;\n", getpid(),ret_val); } } return 0; } ==cut==>%========== sigsem2.c: ========== #include <stdio.h> #include <signal.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <stdlib.h> #include <semaphore.h> // linux: -lpthread volatile int chld_count; sem_t asem; void handler(int sig) { pid_t pid; sem_wait(&asem); chld_count ++; pid = wait(NULL); printf("Pid %d exited. count: %d\n", pid, chld_count); sem_post(&asem); } int main(void) { int i; chld_count=0; sem_init(&asem,0,1); signal(SIGCHLD, handler); for(i=0;i<100;i++) { int ret_val; ret_val=fork(); if(ret_val==-1) { perror("fork()"); } else if(!ret_val) { printf("in child;Child pid is %d\n", getpid()); exit(0); } else { printf("Parent pid is %d; child is %d;\n", getpid(),ret_val); } } return 0; } ==cut==>%========== >Fix: >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200811251224.mAPCO4ta082741>