הבלוג של ארתיום
בלוג על לינוקס, תוכנה חופשית, מוזיקה, סלסה, ומה לא!
ימי הביניים של Unix או FreeBSD 7.1.
כידוע, אני רוצה לוודא כי cppcms ירוץ על מספר מרבי של פלטפורמות תואמות POSIX. כשהפיתוח נעשה לרוב על Linux, אני רוצה לוודא כי הוא ירוץ על כל פלטפורמת POSIX חופשית: שכרגע הן: Linux, OpenSolaris, *BSD ו־Cygwin.
העבודה על לינוקס הרגילה אותי לסטנדרטים גובהים של מימושים ותאימות, תיעוד man מעולה עם דוגמאות והסברים ובכלל --- סביבת פיתוח UNIXית די נוחה.
אבל, כידוע לא כל ה־UNIXים הם זהים. יש פה ושם api שלא ממומש, יש פה ושם סמנטיקות שונות לפעולות בתנאים שונים ועוד. אז אחרי שמצאתי תאימות טובה מאוד ל־solaris גיליתי ש־FreeBSD היא קוץ אחד גדול.
אחת ההפתעות הראשונות שהייתה לי --- pthread_mutexattr_setpshared
לא נתמך. ידעתי שהוא לא נתמך ב־cygwin אבל מ־FreeBSD 7.1 ציפיתי לטוב יותר.
הסבר: זאת אופציה שמאפשרת לשים mutex בזיכרון משותף של שני תהליכים שונים. כל UNIX בוגר תומך באופציה הזו. Linux תומך בזה החל מ־2.6 עם כניסת NPTL והופיע לראשונה ב־RH9.
טוב, מאחר ויש לי תמיכה של "אי־שימוש" במחיר של ביטול רכיבים מסוימים, לא נורא.
המערכת התקמפלה ועבדה יפה. ברגע שניסיתי להפעיל אותה ב־mod_prefork
היא עפה עם unsupported system call...
או קיי? מה זה אומר.
מסתבר, ש־sem_init
גורם לתופעה כזו. אני קורא man -- הכל אמור לעבוד. כותב תוכנת ניסוי פשוטה -- היא עפה. התחלתי לגגל וגיליתי: תמיכה ב־POSIX Semaphores היא ניסיונית מאוד ולא יציבה. צריך לקמפל kernel עם אופציה ספציפית כדי שזה יעבוד!
אם כך, למה להעיף תוכנה? אולי עדיף ש־sem_init
יחזיר שגיאה? או קיי, אז אולי נשתמש במנגנון אחר? נגיד flock? אהה... לפי man של FreeBSD הוא אפילו לא יוצא עם EINTR במקרה של סיגנל (שזאת הסיבה העיקרית שהשתמשתי ב־Posix Semaphores.
היו כמובן עוד כמה נפלאות של עבודה על BSD עצמו: כמו המערכת קבצים ברירת מחדל בכלל לא עובדת עם journaling, תהליך fsck הוא איום. הגדרות בסיסיות על הפנים, pkg_add הנותן שגיאות מאוד "עוזרות וממצאות" "קל מאוד" להגדרה ועוד. תיעוד... לא אכנס לזה. התחושה שאני עובד על איזה Debian Potato... או בעצם גם אז הוא היה קצת יותר טוב.
בקיצור --- אני אומנם אמשיך ואגרום ל־CppCMS לעבוד על FreeBSD כי זה לא מי יודע מה מסובך, אבל...
Free BSD Sucks!!!
חד וחלק!
תגובות
אולי יש גישה אחרת ב BSD שהיא לא POSIX נקי להשיג את אותה פונקציונליות שאתה מחפש ?
צריך להבין שגם לינוקס גם לא תומך ב POSIX כמו שצריך, ויש דברים שהוא מממש לא נכון בתקן (וגם BSD ד"א עם בעיה דומה).
נכון, יש דברים כאלה שלא ממומשים, אבל אני דבק ב־POSIX API ומשתדל להימנע מדברים לא תואמים.
בסה"כ אין הרבה דברים. אני יודע איך לפתור את הבעיה עם semaphores, יותר מזה אפילו מצאתי שאני לא ממש חייב אותם (בפרט הפונקציונליות של EINTR).
בכל אופן: אני כן מצפה ש־UNIXים ישאפו לסטנדרט משותף.
הוסף תגובה:
חובה לאפשר JavaScript כדי להגיב.