所以,我正在为一个项目使用信号,而且我得到的东西并不是我认为的错误。
我将解释,我得到了这段代码,其中sr2是一个由信号SIGUSR2触发的全局变量,信号处理工作正常。但是我编译并运行,当我触发SIGUSR2时,它会打印"用户定义的信号2"并停止。
我在while(1)循环中有这段代码,它不应该停止。 我可以通过打印某些东西来解决问题,比如被评论的printf,但它会一直打印它,我无法创建新的输入,以触发其他信号。
int teste( const char* path , const char* cadeia, const char* erro )
{
int i, x, stat;
int fd = open( path, O_WRONLY | O_CREAT , S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IWOTH | S_IXOTH );
x = flock(fd, LOCK_EX);
if ( sr1 )
{
printf("sr1\n");
//sr1 = !sr1 ;
}
if ( !sr2 )
{
for ( i=0 ; i<CADEIAS ; i++ )
{
stat = write( fd, cadeia, strlen(cadeia));
}
}
else
{
printf("\n");
for ( i=0 ; i<CADEIAS/2 ; i++ )
{
stat = write( fd, cadeia, strlen(cadeia));
stat = write( fd, erro, strlen(erro));
}
}
if ( stp )
{
printf("gtfo\n");
}
x = flock(fd, LOCK_UN);
close(fd);
return 0 ;
}
这是在&#34;线程制作者&#34;:
中调用的void * threadEscritor()
{
int a ;
char *f, *c, *e ;
f = (char *)malloc(sizeof(SIZEFICHEIRO));
c = (char *)malloc(sizeof(SIZECADEIA));
e = (char *)malloc(sizeof(SIZECADEIA));
while(1)
{
a = randomnum(4);
f = pickfile(a, f);
a = randomnum(9);
c = pickchar(a, c);
e = pickerror(a, e);
//escreve1x(f, c, e);
teste(f, c, e);
if(stp)
{
break;
}
}
pthread_exit(0);
}
在main中调用:
int main ()
{
pthread_t tids[NUM_THREADS];
int i, safe ;
void* resultado;
sr1 = false ;
sr2 = false ;
stp = false ;
signal( SIGUSR1, sigHandler );
signal( SIGUSR2, sigHandler );
signal( SIGTSTP, sigHandler );
for ( i=0; i<NUM_THREADS ; i++ )
{
safe = pthread_create( &(tids[i]) , NULL , threadEscritor ) ;
if ( safe != 0 )
perror ("Error creating threads");
}
for ( i=0; i<NUM_THREADS ; i++ )
{
safe = pthread_join( tids[i], &resultado ) ;
if ( safe != 0 )
{
perror ("Errors waiting");
}
}
}
所以我想知道为什么这条消息出现了(因为我没有在任何地方打印)以及为什么它会停止我的while(1)循环,以及为什么如果我创建一个printf()它&#34;解决&#34;问题。