【发布时间】:2018-04-05 09:12:29
【问题描述】:
我需要同步父进程和子进程以在无限循环中按顺序工作,但一段时间后我遇到了死锁。
我不允许使用睡眠,等待,我必须实现与信号的同步。经过搜索,我发现了一个使用暂停方法的类似问题,在答案中建议使用 sigsuspend 而不是暂停。所以我不确定我的实现是否有问题,或者我需要使用另一种方式来避免死锁
这是我的代码
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <time.h>
void catcher( int sig ) {
printf( "inside catcher() function\n" );
}
void timestamp( char *str ) {
time_t t;
time( &t );
printf( "%s the time is %s\n", str, ctime(&t) );
}
int main( int argc, char *argv[] ) {
struct sigaction sigact;
sigset_t block_set1,block_set2;
sigfillset( &block_set1 );
sigfillset( &block_set2 );
sigdelset( &block_set1, SIGUSR1 );
sigdelset( &block_set2, SIGUSR2 );
sigemptyset( &sigact.sa_mask );
sigact.sa_flags = 0;
sigact.sa_handler = catcher;
sigaction( SIGUSR1, &sigact, NULL );
sigaction( SIGUSR2, &sigact, NULL );
pid_t child_id;
child_id = fork ();
if (child_id == 0){
while(1){
printf("child send signal\n");
kill (getppid (), SIGUSR1);
printf("child wait signal\n");
sigsuspend( &block_set2 );
printf("child is going to die\n");
}
}else{
while(1){
timestamp( "before sigsuspend()" );
sigsuspend( &block_set1 );
timestamp( "after sigsuspend()" );
kill (child_id, SIGUSR2);
printf("parent is going to die\n");
}
}
return( 0 );
}
【问题讨论】:
-
家庭作业?阅读条件变量。
-
printf()在信号处理函数中是导致死锁的好方法。在基于 POSIX 的系统上,您只能从信号处理程序中安全地调用异步信号安全函数。每the C standard:“行为未定义如果信号处理程序...调用标准库中的任何函数除了中止函数、_Exit 函数、quick_exit函数,或第一个参数等于导致调用处理程序的信号对应的信号编号的信号函数。"
标签: c synchronization signals deadlock