שאלה ב C ("צינורות") - pipes

ericcartman1

New member
שאלה ב C ("צינורות") - pipes

שאלת טירון ב UNIX/LINUX אני אמור לכתוב תוכנית פשוטה ב C שכוללת תהליך אב ותהליך בן. תהליך הבן עושה חישוב כלשהו ובסופו אמור להעביר את תוצאת החישוב לתהליך האב. הבעייה היא באיזה פקודה להשתמש על מנת להעביר את המשתנה (המשתנה מסוג INT ובכל הדוגמאות שראיתי PIPE מעביר BUFFER כלומר CHAR). חשבתי על שימוש ב ATOI ו ITOA אבל ATOI הוא לא C סטנדרטי... אני עובד עם GCC תחת CYGWIN. כמו כן מצורף קוד (ללא השורות הבעייתיות...). תודה
 

annefan

New member
atoi לא סטנדרטי??

סטנדרטי לגמרי. ההופכי שלו, itoa הוא לא סטנדרטי. במקומו יש את sprintf.
 

zagzagzag

New member
אתה יכול לעבוד עם write

שים לב שהפונקציה מקבלת בפרמטר השני * void ואתה לא מוגבל ל-char. בצד של השולח זה אמור להראות כך -
write(fd[1], &send_integer, sizeof(int));​
ובצד המקבל -
read(fd[0], &receive_integer, sizeof(int));​
כאשר send_integer, recieve_integer הם int.
 

DadleFish

New member
זה נכון, עם הסתייגות אחת

במקרה הספציפי הזה הכל יהיה (כנראה) בסדר כי מדובר על תרגיל פשוט בפלטפורמה אחת, אבל אם מדובר על תוכנה שמדברת בין INTEL לבין מקינטוש (למשל), זה לא יעבוד, בגלל ה-endian השונה.
 

ahardon

New member
מה?

הוא משתמש ב write להעברת נתונים בין שני תהליכים שהם תוצאה של fork(), איזה מצב בחיים יקרה ששני התהליכים ירוצו על מחשבים שונים ועוד בארכיטקטורות שונות? האפשרות היחידה שכזה דבר יקרה זה אם התוכנה רצה על MOSIX, ואני לא חושב שמישהו ייבנה cluster עם מחשבים בעלי ארכיטקטורה שונה, וגם אם כן אני מניח שמערכת ההפעלה של ה cluster תדאג לבעיה שתיארת באופן שקוף.
 

DadleFish

New member
צודק, צודק, צודק

איכשהו קפץ לי לראש SOCKET. טעות, טועים, טעיתי
 

zagzagzag

New member
ואם השאלה הייתה על sockets

איך אפשר לפתור את הבעיה של העברת int בין מחשבים עם endian שונה?
 

DadleFish

New member
לאט לאט ובזהירות, כמובן.

אתה צריך להחליט על ENDIAN משותף במקרה הזה. הייתי כותב wrapper מעל socket, מחליט אם אני רוצה big או little, ועושה את ההסבות בגרסה של הפלטפורמה עם ה-endian ההפוך.
 

DNile

New member
יש לציין אבל,

שהסטנדרט בתקשורת הוא לעבוד בBig endian. חוץ מזה, כחלק מחבילת הsockets יש לך שתי משפחות פונקציות: hton_s, hton_l ו ntoh_s, ntoh_l - כלומר,
host to network long, host to network short, network to host long, network to host short​
שמבצעים את ההמרות עבורך, בהתאם לארכיטקטורה של המחשב.
 
למעלה