תפיסת סיגנל SIGVTALRM
אני כותב תכנית למימוש thread-ים ב-user space על לינוקס. יש לי קטע קוד שנראה כך:
אני כותב תכנית למימוש thread-ים ב-user space על לינוקס. יש לי קטע קוד שנראה כך:
#define INTERVAL 100 // 100ms struct itimerval interval; if (signal(SIGVTALRM, cpu_time_count) == SIG_ERR) FATAL_ERROR; interval.it_value.tv_sec = INTERVAL/1000; interval.it_value.tv_usec = (INTERVAL*1000) % SECOND; interval.it_interval = interval.it_value; if (setitimer(ITIMER_VIRTUAL, &interval, NULL) == -1) FATAL_ERROR; longjmp(...,1);
הקוד שנמצא ב-cpu_time_count פחות משמעותי (נגיד שיש שם ("puts("hi ) משום מה אני לא מקבל את הסיגנל SIGVTALRM, למרות שביקשתי לקבל אותו. כלומר אני מריץ את התוכנית, ולא מתבצעת אף כניסה ל-cpu_time_count. אני מצליח לתת kill -SIGVTALRM 9102 חוץ מהקטע קוד למעלה, יש בתוכנית פונקציה שתופסת את הסיגנל SIGALRM ומבצעת longjmp בין כמה פונקציות עם לולאה אינסופית, כלומר לא משהו שאמור להפריע לתפיסת הסיגנל עד כמה שאני יודע. בנוסף, אם אני מוסיף (while (1 לפני הקריאה ל-longjmp, מתבצעת כניסה ל-cpu_time_count ללא כל בעיה. יש למישהו רעיון / כיוון / הצעה ? אני משתמש בלינוקס, GCC 3.3.3 וקרנל מסדרת 2.6