Sponsored Content
Full Discussion: Losing signal problem
Top Forums Programming Losing signal problem Post 302578294 by DendyGamer on Thursday 1st of December 2011 09:01:44 AM
Old 12-01-2011
Losing signal problem

I'm newbie in UNIX programming, I have a problem with signals. I'm writing multithread program, where threads can die at any moment. When thread dies it generates signal SIGUSR1 to main thread and then thread dies. Main thread gets a signal and waits for thread dead.

I wrote program like this:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/types.h>
#include <signal.h>
#include <semaphore.h>

#define THREADS 3

int threads;
sem_t sem;

void signal_usr1_act(int signo,siginfo_t *inf,void *vd)
{
pthread_t *s;
fprintf(stderr,"Got USR1\n");
s=inf->si_value.sival_ptr;
pthread_join(*s,NULL);
threads--;
fprintf(stderr,"Joined!\n");
if(threads==0)sem_post(&sem);
}

void *thread_func(void*a)
{
union sigval sig_value;
sig_value.sival_ptr=a;
fprintf(stderr,"sending signal\n");
sigqueue(getpid(),SIGUSR1,sig_value); // sending pthread_t*
fprintf(stderr,"sleeping\n");
system("sleep 2"); // Any operation to make a delay
fprintf(stderr,"Stop sleeping\n");
}

int main(int argc,char **argv)
{
int i;
pthread_t pts[THREADS];
sigset_t new_mask,old_mask;
struct sigaction new_sig,old_sig;
// Adding signal action
new_sig.sa_sigaction=signal_usr1_act;
new_sig.sa_flags=SA_SIGINFO;
sigemptyset(&new_sig.sa_mask);
sigfillset(&new_sig.sa_mask);
sigaction(SIGUSR1,&new_sig,&old_sig);
// some initialisation stuff
sem_init(&sem,0,0);
threads=THREADS;
// creating mask
sigemptyset(&new_mask);
sigfillset(&new_mask);
// creating threads
pthread_sigmask(SIG_BLOCK,&new_mask,&old_mask);
for(i=0;i<THREADS;i++)
{
pthread_create(pts+i,NULL,thread_func,pts+i);
// And some other code, where we should block signals
}
pthread_sigmask(SIG_SETMASK,&old_mask,NULL);
// Waiting for threads
do{
pthread_sigmask(SIG_BLOCK,&new_mask,NULL);
fprintf(stderr,"Main is locked! Waiting for %d threads\n",threads);
pthread_sigmask(SIG_SETMASK,&old_mask,NULL);
}while(sem_wait(&sem)<0);
sem_destroy(&sem);
return 0;
}

I've got a problem: some signals were not sended/received and I've got deadlock (main thread waits for signal, but signal never comes).
Program prints:
Code:
Main is locked! Waiting for 3 threads
sending signal
sleeping
Got USR1
sending signal
sleeping
sending signal
sleeping
Stop sleeping
Stop sleeping
Joined!
Got USR1
Joined!
Main is locked! Waiting for 1 threads
Stop sleeping

After it program locks.

Why some signals were not received? Program should send/recive 3 SIGUSR1 and exit, but there are only 2 SIGUSR1. Why?

Last edited by DendyGamer; 12-02-2011 at 04:56 AM..
 

10 More Discussions You Might Find Interesting

1. Programming

[Problem] raise a signal in FreeBSD

I am trying to send a SIGUSR1 to a set of process. Please tell me how to do. I've tried the system call raise(int sig) but it just raise a signal of to the 'current process.' My program is about a network chat server. When a client connects in, The main process will fork a new process... (1 Reply)
Discussion started by: Namely
1 Replies

2. UNIX for Advanced & Expert Users

I have a problem using signal SIGUSR2

hi I have created a application which uses SIGUSR2. It send this signal to server and waits for signal SIGUSR2 from server after server performing some operation server sends SIGUSR2 back to the application. The application then quits. This works fine which ran from terminal , but when I... (3 Replies)
Discussion started by: khan_069
3 Replies

3. Programming

Signal Problem

I am using the signal function, and passing it a function named quit procedure...I get the following warning.... passing arg2 of signal from incompatible pointer type... void quit_procedure(void); //this is the way i define my prototype... signal(SIGINT, quit_procedure); Please guide... (5 Replies)
Discussion started by: jacques83
5 Replies

4. Programming

problem with signal()

#include<signal.h> void suicide(); main() { printf("use CTRL \\ for exiting \n"); //signal(SIGINT,SIG_DFL); signal(SIGQUIT,suicide); for (;;); } void suicide() { printf("hello here you r in the suicide code "); } i was just starting with signals .. and tried this ,, but in the... (10 Replies)
Discussion started by: narendra.pant
10 Replies

5. Programming

Problem with signal handler and interrupted system call

Hi, I have a daq program that runs in an infinite loop until it receives SIGINT. A handler catches the signal and sets a flag to stop the while loop. After the loop some things have to be cleaned up. The problem is that I want my main while loop to wait until the next full second begins, to... (2 Replies)
Discussion started by: soeckel
2 Replies

6. Programming

problem in SIGSEGV signal handling

i wrote handler for sigsegv such that i can allocate memory for a variable to which sigsegv generated for illlegal acces of memory. my code is #include <signal.h> #include<stdio.h> #include<stdlib.h> #include<string.h> char *j; void segv_handler(int dummy) { j=(char *)malloc(10); ... (4 Replies)
Discussion started by: pavan6754
4 Replies

7. Programming

problem in reforking and signal handling

hi friends i have a problem in signal handling ... let me explain my problem clearly.. i have four process .. main process forks two child process and each child process again forks another new process respectively... the problem is whenever i kill the child process it is reforking and the... (2 Replies)
Discussion started by: senvenugopal
2 Replies

8. Programming

UNIX signal problem

Hi all, Sorry about the title,at first i decided to ask a problem about the signal mechanism,however,i'm now figured it out.Sorry to forget modify the title:wall:.I had a small problem that if i use the code which is commented,the code would get a segment fault,while the above code NOT.what's... (4 Replies)
Discussion started by: homeboy
4 Replies

9. Programming

problem in doing coding of signal handler

i m unble to execute code of signal handler using a) Wait b) Waitpid (1 Reply)
Discussion started by: madhura
1 Replies

10. Linux

Problem with dovecot (Killed with signal 15)

hey, i have been facing a very fatel error with dovecot.. i am getting this error in my dovecot.log file dovecot: Feb 13 15:21:02 Fatal: chdir(/var/mail/folders/user1) failed with uid 1001: Permission denied dovecot: Feb 13 15:21:02 Error: child 18732 (imap) returned error 89 dovecot: Feb... (3 Replies)
Discussion started by: htshshrm2
3 Replies
PTHREAD_SIGMASK(3)					     Linux Programmer's Manual						PTHREAD_SIGMASK(3)

NAME
pthread_sigmask - examine and change mask of blocked signals SYNOPSIS
#include <signal.h> int pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset); Compile and link with -pthread. DESCRIPTION
The pthread_sigmask() function is just like sigprocmask(2), with the difference that its use in multithreaded programs is explicitly speci- fied by POSIX.1-2001. Other differences are noted in this page. For a description of the arguments and operation of this function, see sigprocmask(2). RETURN VALUE
On success, pthread_sigmask() returns 0; on error, it returns an error number. ERRORS
See sigprocmask(2). CONFORMING TO
POSIX.1-2001. NOTES
A new thread inherits a copy of its creator's signal mask. EXAMPLE
The program below blocks some signals in the main thread, and then creates a dedicated thread to fetch those signals via sigwait(3). The following shell session demonstrates its use: $ ./a.out & [1] 5423 $ kill -QUIT %1 Signal handling thread got signal 3 $ kill -USR1 %1 Signal handling thread got signal 10 $ kill -TERM %1 [1]+ Terminated ./a.out Program source #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <errno.h> /* Simple error handling functions */ #define handle_error_en(en, msg) do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0) static void * sig_thread(void *arg) { sigset_t *set = (sigset_t *) arg; int s, sig; for (;;) { s = sigwait(set, &sig); if (s != 0) handle_error_en(s, "sigwait"); printf("Signal handling thread got signal %d ", sig); } } int main(int argc, char *argv[]) { pthread_t thread; sigset_t set; int s; /* Block SIGINT; other threads created by main() will inherit a copy of the signal mask. */ sigemptyset(&set); sigaddset(&set, SIGQUIT); sigaddset(&set, SIGUSR1); s = pthread_sigmask(SIG_BLOCK, &set, NULL); if (s != 0) handle_error_en(s, "pthread_sigmask"); s = pthread_create(&thread, NULL, &sig_thread, (void *) &set); if (s != 0) handle_error_en(s, "pthread_create"); /* Main thread carries on to create other threads and/or do other work */ pause(); /* Dummy pause so we can test program */ } SEE ALSO
sigaction(2), sigpending(2), sigprocmask(2) pthread_create(3), pthread_kill(3), sigsetops(3), pthreads(7), signal(7) COLOPHON
This page is part of release 3.25 of the Linux man-pages project. A description of the project, and information about reporting bugs, can be found at http://www.kernel.org/doc/man-pages/. Linux 2009-01-25 PTHREAD_SIGMASK(3)
All times are GMT -4. The time now is 01:24 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy