כמה בעיות ב C - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

כמה בעיות ב C


amirxbox

Recommended Posts

1. אני מנסה לפתוח קובץ

in=open(redirect, O_CREAT | O_SYNC | O_RDWR,O_RDWR | S_IRWXU);

אבל משום מה IN נשאר NULL.

דבר שני איך אני פותח את STDIN לאחר שסגרתי אותו?

משום מה פתיחת

/dev/stdin לא הולך..

קישור לתוכן
שתף באתרים אחרים

ראשית, בד"כ עדיף לא לסגור את stdin. אתה לא יודע מה הוא היה, ואתה לא יודע אם תוכל לפתוח אותו מחדש. הצד השני עלול להיות תוכנה שתקבל broken pipe לדוגמא. לפחות תעשה dup לפני. יש מקרים יוצאי דופן שבהם כן משחקים איתו, לדוגמא ב-fork.

שנית, open לא מחזיר פוינטר. הואר מחזיר file descriptor.

0 הוא file descriptor של stdin במערכות unix. למעשה פתיחת הקובץ הצליחהף וקיבלת את ה-fd האחרון שנסגר (משהו ש-unix מבטיחה לך).

לבסוף, כתשובה לשאלתך, אתה לא ממש יכול לפתוח מחדש את stdin, ולכן גם אל תסגור אותו. אתה פשוט לא יודע מה הוא היה.

לא ברור לי מה אתה מנסה לעשות, אבל אם אתה מנסה שקריאה מ-stdin תופנה לקריאה מקובץ, יש דרכים טובות יותר.

קישור לתוכן
שתף באתרים אחרים

העניין הוא שבתיאור העבודה כתוב בפירוש יש לסגור את STDIN ע"י close(0) לפתוח קובץ כלשהו להפעיל תוכניות נדרשות ע"י

The system call execv ,מיד לאחר ביצוע הפעולות יש לפתוח את STDIN.

בעיקרון זה החלק האחרון שיש לי בכתיבת SHELL החלק נקרא File redirection.

וכן אני בהחלט רוצה שהתוכנית שתיקרא ע"י execv תקרא מה FD עם הערך הכי נמוך, אשמח לדרך חלופית ישבתי על זה כבר 8 שעות.

תודה.

קישור לתוכן
שתף באתרים אחרים

בוא נעשה סדר בדברים, ונראה אם אני מבין הכל:

1) קיבלת תרגיל במערכות הפעלה או בקורס דומה.

2) בתרגיל אתה צריך לעשות fork (אפשר גם לא), ואז אתה צריך לעבור להרצה של תוכנית אחרת.

3) לפני שאתה עובר להרצה של התוכנית האחרת, אתה צריך להפנות את הקלט הסטנדרטי שלה מקובץ.

מזל טוב, הצלחת!

ה-open מחזיר FD 0 שזה בדיוק stdin.

אתה לא יכול ממש לפתוח מחדש את הקלט הסטנדרטי המקורי בכל מקרה משתי סיבות:

1) אתה לא יודע מה הוא היה. זו הסיבה הרגילה.

2) התוכנית שלך מסתיימת לרוץ אחרי execv ועוברת לתוכנית שהרצת (בהנחה ש-execv הצליח) ולכן כל קוד שתשים אחרי בכל מקרה לא יורץ.

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...