תפיסת סיגנל SIGVTALRM

zagzagzag

New member
תפיסת סיגנל SIGVTALRM

אני כותב תכנית למימוש 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
 

zagzagzag

New member
שכחתי משהו

הגדרת SECOND:
#define SECOND 1000000​
ה-longjmp בשורה האחרונה מוביל לאחת הפונקציות
 

voguemaster

New member
אני רק רוצה לוודא

אתה יודע שאין queue של סיגנלים נכון ? כלומר אם אתה בתוך signal handler, כמה דברים עיקריים קורים: 1. התוכנית שלך מפסיקה לעבוד לגמרי והשליטה עוברת ל-handler. 2. סיגנלים נוספים הולכים להם לעולמם אם הם מגיעים בזמן שאתה ב-handler. (היה עוד משו אבל שכחתי...)
 

zagzagzag

New member
כן, אני יודע, ומצאתי את הבעיה ../images/Emo13.gif

הייתה לי פקודת sleep בפונקציות שאמורות לרוץ ב"מקביל", ואחרי שמחקתי אותה התוכנית עובדת. יכול להיות שבגלל שהיה שימוש מועט במעבד לא קיבלתי את הסיגנל?
 

selalerer

New member
../images/Emo32.gif סיגנלים הולכים לאיבוד???

אני חדש למדיי בעסק ובספר שלי כתוב שהוא פשוט קופץ לhandler של הסיגנל הנוסף שהוא מקבל ואתה צריך לקחת בחשבון בhandler שאולי אתה באמצע ריצה של handler אחר. או שהיבנתי לא נכון?
 

voguemaster

New member
יכול מאוד להיות שאתה צודק

הממ.. אני לא סגור על זה. כנראה שאם יש כמה סיגנלים מאותו סוג אז אתה מקבל רק אחד וכל השאר "נעלמים" (עברו חיסול כמו יאסין
)
 

DadleFish

New member
לא כנראה, זה בטוח.

זה אחד הפאקים הקיימים במערכת של הסיגנלים - אין "צבירה" שלהם. אם תבדקו בקוד של הקרנל תראו שמדובר בסה"כ באוסף FLAG-ים פשוט.
 
למעלה