前回、マルチスレッドプログラムについて説明した者です。
シグナルにおいて非同期シグナルセーフな関数を用いずに処理をおこなっていたため、デッドロック等の可能性を踏まえプログラムを改良しております。
シグナルではなくsigwait() を用いて、同期的なシグナル待機に書き換えております。sigwait()を使用することで、非同期シグナルセーフな関数に限定せずにプログラムを書くことができるため、これを利用しています。
プログラムは全てのスレッドで受信に関するシグナルをブロックし、sigwait()の返答により、受信を開始しています。
無事にsigwait()からの信号により受信を確認できたのですが、
連続で受信を行っていると途中で取りこぼしが発生します。
この取りこぼしをなくすような工夫がございましたら、ご教示お願い致します。またプログラムの不完全な点の指摘もあわせてしていただけましたら幸いです。
C
1 2 sigset_t ss; 3 4 <略> 5 6 sigemptyset( &ss ); 7 ret = sigaddset( &ss, SIGIO ); 8 if( ret != 0 ){ 9 perror( "sigaddset" ); 10 return -1; 11 } 12 13 ret = pthread_sigmask( SIG_BLOCK, &ss, NULL ); 14 if( ret != 0 ){ 15 perror( "pthread_sigmask" ); 16 return -1; 17 } 18
C
1sigwait() を処理するスレッド 2 3void* wwait(){ 4 5 while(1){ 6 printf( "sigwait...\n" ); 7 8 if( sigwait( &ss, &signo ) == 0 ){ 9 10 pthread_mutex_lock( &mutex0 ); 11 condition = 1; 12 pthread_cond_signal( &cond0 ); 13 pthread_mutex_unlock( &mutex0 ); 14 15 } 16 } 17 18 pthread_exit(0); 19}
C
1受信処理をおこなうスレッド 2 3// receive thread 4void* thread0(){ 5 6 pthread_mutex_init( &mutex0, NULL ); 7 pthread_cond_init( &cond0, NULL ); 8 9 memset( &action, 0, sizeof(action) ); 10 memset( &evp, 0, sizeof(evp) ); 11 12 while(1){ 13 printf( "receive...\n" ); 14 15 pthread_mutex_lock( &mutex0 ); 16 17 while( !condition ){ 18 pthread_cond_wait( &cond0, &mutex0 ); 19 } 20 21 condition = 0; 22 23 memset( buffer, '\0', sizeof(buffer) ); 24 k = 0; 25 26 k = read( fd[0], buffer, sizeof(buffer) ); 27 printf( "receive char : %d \n" , k ); 28 29 pthread_mutex_unlock( &mutex0 ); 30 31 } 32 33 pthread_exit(0); 34} 35
ikedas 様
追記致します.
シリアルポート通信速度は115200bps
また, このプログラムはlinuxの動くマイコンで動作させ,対向とはRS232Cを使用してモデムと接続しデータ通信をおこないます.
しかし現在はまだデバッグ段階のため, デスクトップとノートパソコンをUSB-シリアル, クロスケーブルで接続し, ノートパソコンでは一定周期でシリアル通信で送信するプログラムを動作させています.
また加えてお答え頂ければ幸いですが、タイマーハンドラでもシグナルハンドラと同様に、シグナルセーフな関数し使用することができないのでしょうか。
回答2件
あなたの回答
tips
プレビュー