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_SIGNAL(3)					     Library Functions Manual						 PTHREAD_SIGNAL(3)

NAME
pthread_sigmask, pthread_kill, sigwait - handling of signals in threads SYNOPSIS
#include <pthread.h> #include <signal.h> int pthread_sigmask(int how, const sigset_t *newmask, sigset_t *oldmask); int pthread_kill(pthread_t thread, int signo); int sigwait(const sigset_t *set, int *sig); DESCRIPTION
pthread_sigmask changes the signal mask for the calling thread as described by the how and newmask arguments. If oldmask is not NULL, the previous signal mask is stored in the location pointed to by oldmask. The meaning of the how and newmask arguments is the same as for sigprocmask(2). If how is SIG_SETMASK, the signal mask is set to newmask. If how is SIG_BLOCK, the signals specified to newmask are added to the current signal mask. If how is SIG_UNBLOCK, the signals specified to newmask are removed from the current signal mask. Recall that signal masks are set on a per-thread basis, but signal actions and signal handlers, as set with sigaction(2), are shared between all threads. pthread_kill send signal number signo to the thread thread. The signal is delivered and handled as described in kill(2). sigwait suspends the calling thread until one of the signals in set is delivered to the calling thread. It then stores the number of the signal received in the location pointed to by sig and returns. The signals in set must be blocked and not ignored on entrance to sigwait. If the delivered signal has a signal handler function attached, that function is not called. CANCELLATION
sigwait is a cancellation point. RETURN VALUE
On success, 0 is returned. On failure, a non-zero error code is returned. ERRORS
The pthread_sigmask function returns the following error codes on error: EINVAL how is not one of SIG_SETMASK, SIG_BLOCK, or SIG_UNBLOCK EFAULT newmask or oldmask point to invalid addresses The pthread_kill function returns the following error codes on error: EINVAL signo is not a valid signal number ESRCH the thread thread does not exist (e.g. it has already terminated) The sigwait function never returns an error. AUTHOR
Xavier Leroy <Xavier.Leroy@inria.fr> SEE ALSO
sigprocmask(2), kill(2), sigaction(2), sigsuspend(2). NOTES
For sigwait to work reliably, the signals being waited for must be blocked in all threads, not only in the calling thread, since otherwise the POSIX semantics for signal delivery do not guarantee that it's the thread doing the sigwait that will receive the signal. The best way to achieve this is block those signals before any threads are created, and never unblock them in the program other than by calling sigwait. BUGS
Signal handling in LinuxThreads departs significantly from the POSIX standard. According to the standard, ``asynchronous'' (external) sig- nals are addressed to the whole process (the collection of all threads), which then delivers them to one particular thread. The thread that actually receives the signal is any thread that does not currently block the signal. In LinuxThreads, each thread is actually a kernel process with its own PID, so external signals are always directed to one particular thread. If, for instance, another thread is blocked in sigwait on that signal, it will not be restarted. The LinuxThreads implementation of sigwait installs dummy signal handlers for the signals in set for the duration of the wait. Since signal handlers are shared between all threads, other threads must not attach their own signal handlers to these signals, or alternatively they should all block these signals (which is recommended anyway -- see the Notes section). LinuxThreads PTHREAD_SIGNAL(3)
All times are GMT -4. The time now is 05:35 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy