שבוע #14
פרקFile System Implementation :
מימוש מערכת הקבצים – חלק אחרון
קורס מערכות הפעלה ב'
מכללת הדסה /מכללה חרדית
צבי מלמד
Tzvi.Melamed@gmail.com
הרצאות הקורס מבוססות במידה רבה ביותר על ההרצאות של ד"ר יורם ביברמן
© כל הזכויות שמורות לד"ר יורם ביברמן ולצבי מלמד
©צבי מלמד
1
הפונקציה )(fcntl
• הפונקציה )( fcntlמשמשת לצורך קביעת ושליפת התכונות של
קובץ פתוח:
©צבי מלמד
161
הפונקציה )( - fcntlשימושים
fcntl(filedes, F_DUPFD, filedes2); (1
– F_DUPFD = DUplicate File Descriptor
–
שקולה לפונקציה dup(filedes, filedes2); :
–
מחזירה את מספר המתאר החדש )שיהיה בהכרח קטן או
שווה ל(filedes2-
–
מחזירה -1אם נכשלה.
– המתאר החדש מצביע לאותה כניסה בטבלת הקבצים
הפתוחים אך יש לו דגלי מתאר נפרדים.
•
)הדגל היחיד שקיים FD_CLOEXEC :מציין אם יש
לסגור את הקובץ כשמבצעים )(( exec
©צבי מלמד
162
שימושים- fcntl() הפונקציה
fcntl(filedes, F_SETPFD, FD_CLOEXEC); (2
SET File Descriptor –
קובע שהקובץ ייסגר בזמן- FD_CLose On EXEC
–
exec() ביצוע
: על ידי הפקודהFD נקבל את ערך הסטטוס של ה,( באופן סימטרי3
val = fcntl(filedes, F_GETPFD, 0);
if (val== .....)
163
©צבי מלמד
דוגמהfile_fnctl1.c :
©צבי מלמד
164
הרצהfile_fnctl1.c :
©צבי מלמד
165
שימושים- fcntl() הפונקציה
.( טיפול בדגלי הסטטוס4
: והוגדרוfd מכיל את המספר שלargv[1] – נניח ש
int val, accmode;
if ((val=fcntl(atoi(argv[1]), F_GETFL,0)<0)
...
(0 הפרמטר השלישי הוא תמידf_fetgl )כאשר הפעולה היא
accmode = val & O_ACCMODE;
()זאת הדרך לנקות חלק מהסיביות בכדי שלא ישפיעו על הפעולות הבאות
if (accmode==O_RDONLY) puts(“read-only”);
if (accmode==O_WRONLY) puts(“write-only”);
if (accmode==O_RDWR) puts(“read + write”);
else puts (“unknown access mode”);
if (val & O_APPEND) puts (“+ append”);
if (val & O_SYNC) puts (“+ synchronized writes”);
166
©צבי מלמד
הערות על דגלי הסטטוס – הערה #1
• כאשר רוצים לקבוע דגל סטטוס חדש צריך
לבצע:
– לקבל את הדגלים הקיימים
– להוסיף את הדגל הרצוי
– לעדכן את הדגלים.
;int val
)if (val=fcntl(fd, F_GETFL,0) <0
... error...
;val |= O_SYNC
)if (fcntl(fd, F_SETFL, val) <0
... error...
בכדי לבטל דגל מסוים ,הפעולה שנעשה:
val &= ~O_SYNC
©צבי מלמד
167
הערות על דגלי הסטטוס – הערה #2
• כאשר מריצים פקודה עם – redirectionלמשלa,out >out.txt :
ה shell-פותח את הקובץ out.txtאבל לא מדליק עבורו את הדגל
.O_SYNC
• אם נרצה להדליק את הדגל הזה ,נצטרך לעשות באמצעות ) fcntlכפי
שראינו(
• באופן דומה לגבי - a.out 2>>err.txt:נפתח במוד O_APPEND
אבל ללא O_SYNC
• ב) bash -להבדיל מ (tcsh-הפקודה a.out 5<>temp.txt
מקשרת את מתאר הקובץ ,#5לקובץ הנ"ל שנפתח לקריאה+כתיבה .אזי
ניתן לבצע:
read(5, &num, 4)...
write(5, &num, 4)...
לקובץ יש מכוון יחיד שמוזז בכל אחת מהפעולות
©צבי מלמד
168
הערות על דגלי הסטטוס – הערה #3
•
•
הדלקת הדגל O_SYNCמגדילה את זמן הריצה clock or wall-) system-time
(timeאבל השפעתה זניחה על הcpu-time -
לדוגמא ,בניסוי שמתואר בספר )בשקף הבא( :קוראים קובץ של ~100MB
מהדיסק ,וכותבים אותו...
.1קריאה מהדיסק -בלוקים של 4KBוכתיבה לתוך /dev/null
.2קריאה מהדיסק כנ"ל ,וכתיבה לקובץ בדיסק )הגרעין כותב את הdata-
לתור של ה] (disk-driver-אין עליה משמעותית ב – clock-timeבגלל
שהכתיבה היא ל(system-cache-
.3כתיבות סינכרוניות תוך שימוש ב .O_SYNCH-היינו מצפים שהזמן יעלה
משמעותית – אבל לא ...מסקנה :מערכת הקבצים של ext2איננה
מכבדת את הדגל הזה
.4בשלוש השורות הבאות – כתיבות סינכרוניות על ידי פקודות סינכרון –
ואכן הזמן עולה פי שלוש ,למרות שזמן המעבד נותר כמעט ללא שינוי
©צבי מלמד
169
הערות על דגלי הסטטוס – הערה #3
©צבי מלמד
170
דוגמא :הקובץ file_fcntl2.c
©צבי מלמד
171
דוגמא :הקובץ
file_fcntl2.c
©צבי מלמד
172
#include
#include
#include
#include
#include
#include
#include
#include
#include
<sys/types.h>
<sys/stat.h>
<fcntl.h>
<stdlib.h>
<stdio.h>
<unistd.h>
<fcntl.h>
<string.h>
<time.h>
// EXIT_SUCCESS
// perror
// read/write/lseek/STDIN_FILENO
files_fcntl2.c
(full text)
#define
OUTPUT_STR
"This string is sent to stdout"
//---------------------------------------------------------int main(int argc, char **argv) {
int fd ;
int val ;
long i ;
unsigned long t1 = (unsigned) time(NULL) ;
if (argc != 3) {
printf("usage: %s <output file name> <0/1 (for O_SYNC)\n", argv[0]) ;
return( EXIT_FAILURE ) ;
}
173
©צבי מלמד
if ((fd = open(argv[1], O_WRONLY | O_CREAT | O_TRUNC, 0600)) < 0) {
perror("cannot open output file") ;
return( EXIT_FAILURE ) ;
}
if ((val = fcntl(fd, F_GETFL, 0)) < 0) {
perror("cannot fcntl(fd, F_GETFL,...)") ;
return( EXIT_FAILURE ) ;
}
if (atoi(argv[2]) == 1) {
val |= O_SYNC ;
if (fcntl(fd, F_SETFL, val) < 0)
fputs("unable to raise O_SYNC flag on file", stderr) ;
else
fputs("O_SYNC raised\n", stderr) ;
}
else {
val &= ~O_SYNC ;
if (fcntl(fd, F_SETFL, val) < 0)
fputs("unable to turn off O_SYNC flag", stderr) ;
else
fputs("O_SYNC is turned off\n", stderr) ;
}
files_fcntl2.c
(full text)
174
©צבי מלמד
files_fcntl2.c (full text)
for (i=0; i < 5000000; i++)
if (write(fd, OUTPUT_STR, strlen(OUTPUT_STR)) <
strlen(OUTPUT_STR)) {
perror("write failed") ;
return( EXIT_FAILURE ) ;
}
fprintf(stderr, "time = %ld\n",
return( EXIT_SUCCESS ) ;
}
175
©צבי מלמד
(unsigned) time(NULL) - t1) ;
הערות על דגלי הסטטוס – הערה #4
• פקודת )( umaskמגבילה את ההרשאות שתהליך יכול לתת
לקבצים – בפקודת הפתיחה /יצירה.
• הדגמה -בשקף הבא
©צבי מלמד
176
umask demo – file_open_777.c
התוכנית פותחת/יוצרת קבצים
עם בקשה להרשאה .777
בהרצה בעמוד הבא ,נראה מהן
ההרשאות שנוצרות בפועל,
כתלות בהגדרת הUMASK-
©צבי מלמד
177
umask demo – file_open_777.c
הצגת umaskאוקטלי ובצורת
טקסט )הדגל (–S
קיראו בעיון ,שורה
אחר שורה.
שימו לב כיצד
ההרשאות משתנות
כאשר ה UMAX
משתנה
©צבי מלמד
178
שימוש ב fcntl()-לשם נעילת הקבצים /רשומות
•
.1
.2
•
.1
.2
קיימות שתי תפישות שונות בסוגיית הנעילה:
מנעול הכרחי – – mandatory lockבכדי לפנות לקובץ ,ראשית חובה
לנעול אותו
– ה kernel-בודק בכל open, read, writeשאין הפרה של נעילה על
הקובץ .נקרא גםenforcement-mode locking:
מנעול המלצתי – advisory lockלא חייבים לנעול את הקובץ בכדי
לקרוא/לכתוב ממנו ,אבל זה מומלץ מסיבות של סנכרון בין תהליכים.
– כמו כן אפשרי רק לבדוק אם הקובץ נעול
)תזכורת( קיימים שני סוגי מנעולים:
– shared lockמשותף )לקריאה( – מספר תהליכים יכולים לקבל אותו,
ורק לקרוא מהקובץ בו זמנית
– exclusive lockבלבדי )לכתיבה( ,לתהליך אחד בכל נקודת זמן
©צבי מלמד
179
שימוש ב fcntl()-לשם נעילת הקבצים /רשומות
• בווריאנטים שונים של יוניקס קיימות פקודות נעילה שונות:
– )( lockfבמערכות ) system-Vאומץ על ידי (POSIX
– )( flockבמערכות BSD
•
נכיר כאן את אפשרויות הנעילה באמצעות )( ,fcntlשהינן פעולות
ברמה נמוכה יותר .בד"כ משתמשים בפעולות אלה כאשר
הפעולות המופשטות יותר אינן מספקות.
•
)( - fcntlמספק מנעול המלצתי.
–
בלינוקס )( lockfמספק ממשק נוח יותר לfcntl()-
©צבי מלמד
180
שימוש ב fcntl()-לשם נעילת הקבצים /רשומות
–
בלינוקס )( lockfמספק ממשק נוח יותר לfcntl()-
©צבי מלמד
181
לשם נעילת הקבציםfcntl()-שימוש ב
: struct flock המשתנה שנזדקק לו – מטיפוס
•
#include <fcntl.h>
struct flock fl;
: struct flock • עלינו להגדיר את המשתנה שנזדקק לו – מטיפוס
#include <fcntl.h>
struct flock fl;
struct flock {
short l_type;
/* F_RDLCK, F_WRLCK, or F_UNLCK */
off_t l_start;
/* offset in bytes, relative to l_whence */
short l_whence; /* SEEK_SET, SEEK_CUR, or SEEK_END */
off_t l_len;
/* length, in bytes; 0 means lock to EOF */
pid_t l_pid;
/* returned with F_GETLK */
};
182
©צבי מלמד
שימוש ב fcntl()-לשם נעילת הקבצים
•
נכריז על ) type of lockאופנות הנעילה(:
;fl.l_type = F_WRLCK
אפשרויות נוספות:
– – F_RDLCKלקריאה בלבד
– – F_UNLCKשחרור מנעול שנרכש
• עכשיו נגדיר באמצעות שלוש תכונות את קטע הקובץ שינעל:
;fl.l_whence = SEEK_SET
• כלומר ,הנעילה היא יחסית לתחילת הקובץ.
• אפשרויות נוספות:
– – SEEK_CURהנעילה היא יחסית למקום הנוכחי של המכוון
– –SEEK_ENDהנעילה היא יחסית לסוף הקובץ
©צבי מלמד
183
שימוש ב fcntl()-לשם נעילת הקבצים
•
באיזה הסטה )יחסית למה שתואר קודם( יתחיל הקטע הנעול )כאן:
בהסטה אפס( ,וכמה בתים יש לנעול )אפס = לנעול עד סוף הקובץ(
;fl.l_start = 0
;fl.l_len = 0
• עכשיו אנו יכולים לפתוח את הקובץ ,ואז לנעול אותו:
;)fd=open(“out_file”, O_WRONLY
)if (fcntl(fd, F_SETLKW, &fl) < 0
......
• הפתיחה צריכה להיות בהתאמה לסוג המנעול הדרוש – )כתיבה +מנעול
בלבדי(
©צבי מלמד
184
שימוש ב fcntl()-לשם נעילת הקבצים
• הנעילה תחסום את התהליך עד שניתן יהיה לספק לו את המנעול )זאת
משמעות ה W-ב ,F_SETLKW -כאשר Wעבור .(wait
• אפשרויות נוספות לדגלים:
– –F_SETLKפעולת הנעילה תיכשל )ותחזיר (-1ותחזור מיד אם לא ניתן לקבל
את המנעול מידית )כלומר ניסיון נעילה ללא נכונות להמתין(
– –F_GETLKבדיקת מצב הנעילה .אם קיים מנעול שמתנגש עם זה שמתואר ב-
flאזי ערכו יוחזר ב .fl.l_type -אחרת ,בשדה הזה יוחזר הערך:
F_UNLCK
• לאחר שבצענו את הפעולות הנ"ל ,קטע הקובץ הדרוש נעול במנעול המבוקש.
• בכדי לשחרר את המנעול צריך לשנות רק שדה אחד במבנה )השאר נותרים כמות
שהם(:
;fl.l_type = F_UNLCK
...fcntl(fd, F_SETLKW, &fl)...
©צבי מלמד
185
שימוש ב fcntl()-לשם נעילת הקבצים
• הערה:
– נניח שביקשנו לנעול את הקובץ באופן בלבדי ),(F_WRLCK
ולהמתין עד קבלת המנעול ).(F_SETLKW
– אם הקובץ נעול כבר על ידי קוראים עלינו להמתין
– אם במהלך ההמתנה יגיעו קוראים נוספים – הם יקבלו את
המנעול
– התוצאה :חשש להרעבה
©צבי מלמד
186
דוגמא:
fcntl_lock.c
©צבי מלמד
187
דוגמא:
fcntl_lock.c
©צבי מלמד
188
דוגמא:
fcntl_lock.c
©צבי מלמד
189
הרצה:
fcntl_lock.c
©צבי מלמד
190
טיפול בהרשאות
• ההרשאות לקובץ נקבעות כאשר יצרנו את הקובץ
– – BTW) apropos: umaskשימו לב aproposהיא פקודת
יוניקס .נסו להריץ apropos apropos :או (man apropos
• פעולות רלבנטיות בהקשר להרשאות:
– א .לבדוק את ההרשאות הקיימות
– ב .לשנות את ההרשאות
• בהתאמה ,קיימות שתי פונקציות ספריה:
– )(access
– )(chmod
©צבי מלמד
191
access() טיפול בהרשאות – הפונקציה
NAME
access - check user\u2019s permissions for a file
SYNOPSIS
#include <unistd.h>
int access(const char *pathname, int mode);
DESCRIPTION
access checks whether the process would be allowed to read, write or
test for existence of the file (or other file system object) whose name
is pathname. If pathname is a symbolic link permissions of the file
referred to by this symbolic link are tested.
mode is a mask consisting of one or more of R_OK, W_OK, X_OK and F_OK.
192
©צבי מלמד
access() טיפול בהרשאות – הפונקציה
בודקת האם התהליך הנוכחי רשאי לבצע פעולה כלשהיaccess() • הפונקציה
על קובץ
R_OK, W_OK, X_OK, : ומסכה של הרשאות, לקובץpath • מקבלת
( ביניהןOR ׁ )ניתן לבצעF_OK
אם לפחות אחת מהן אסורה-1 אפס אם כולן מותרות או:• מחזירה
if (access(“../my_file”, R_OK)==0)
puts(“can read ../my_file\n”);
if (access(“~yoramb/os”, W_OK)==0)
puts(“~yoramb/os” is writable\n”);
if (access(“~/bin/my_script”, R_OK|W_OK)==0) &&
(access(“~/bin/my_script, X_OK)!=0)
{
puts(“~/bin/my_script is read-write enabled, “);
puts(“but it is not executable\n”);
}
193
©צבי מלמד
טיפול בהרשאות – הפונקציה )(access
• ניתן לבדוק גם את קיומו או אי-קיומו של הקובץ על ידי שימוש
בF_OK -
)if (access(“../../dir2/dir3/kuku.txt”, F_OK)==0
;)”puts(“../../dir2/dir3/kuku.txt”, exists
©צבי מלמד
194
עדכון הרשאות – הפונקציה )(chmod
©צבי מלמד
195
עדכון הרשאות – הפונקציה )(chmod
• הפונקציה )( chmodמאפשרת לעדכן/לשנות את ההרשאות על
קובץ קיים
)if (chmod(“myfile”, S_IRUSR | S_IWUSR)==-1
;)”perror(“chmod myfile failed
הסבר הדגלים:
•
– S_Iתחילית קבועה לכל הדגלים בפונקציה זאת
•
התו הבא R :קריאה W ,כתיבה X ,ביצוע
•
USRאו – Uבעלים
•
GRPאו – Gהקבוצה
•
OTHאו ) Other – Oכל השאר(
•
פרטים נוספיםman 2 chmod :
ק+כ+הרצה לבעלים – S_IRWXU
ק+כ+הרצה לקבוצה – S_IRWXG
ק+כ+הרצה לכל העולם – S_IRWXO
קריאה לקבוצה – S_IRGRP
קריאה לעולם – S_IROTH
©צבי מלמד
196
– דוגמא
check_n_update
_access_mode.c
197
©צבי מלמד
check_n_update_access_mode.c – הרצה
198
©צבי מלמד
check_n_update_access_mode.c
#include
#include
#include
#include
#include
#include
<stdio.h>
<stdlib.h>
<unistd.h>
<strings.h>
<string.h>
<sys/stat.h>
//
//
//
//
for
for
for
for
access()
rindex()
strcmp()
chmod()
int main(int argc, char **argv) {
char *suffix ;
if (argc != 2) {
fprintf(stderr, "Usage: %s <file name>\n", argv[0]) ;
exit(EXIT_FAILURE) ;
}
if (access(argv[1], F_OK) != 0) {
puts("File does not exist");
exit(EXIT_SUCCESS) ;
}
199
©צבי מלמד
if (access(argv[1], R_OK | W_OK | X_OK) == 0) {
puts("rwx");
}
if (access(argv[1], R_OK) == 0) puts("r");
if (access(argv[1], W_OK) == 0) puts("w");
if (access(argv[1], X_OK) == 0) puts("x");
// .c file?: change its access mode to
rw- --- ---
suffix = rindex(argv[1], '.') ;
printf("suffix is ===%s\n", suffix);
if(suffix != NULL && strcmp(suffix, ".c")==0)
if (chmod(argv[1], S_IRUSR | S_IWUSR) == -1 ) {
perror("chmod() failed") ;
exit(EXIT_FAILURE) ;
}
else
puts("chmod to rw- --- ---") ;
else
puts("no chmod was done") ;
exit(EXIT_SUCCESS) ;
}
200
©צבי מלמד
check_n_update_
access_mode.c
טיפול בהרשאות – ברמת הshell-
• בדיקה ושינוי של הרשאות או קיום של קבצים אפשרית גם ברמת ה-
) shellכולם תומכים בזה ,הסינטקס עשוי להיות שונה במקצת(
• הסקריפט הבא ):(tcsh script
– יוצר קובץ בשם myfile
– בודק ו"מדפיס" האם הוא writable
– מבטל את הרשאות הכתיבה
– בודק ו"מדפיס" האם הוא writable
– בודק האם הוא קיים ומדפיס הודעה
– מוחק את הקובץ
– בודק האם הוא קיים ומדפיס הודעה
©צבי מלמד
201
טיפול בהרשאות
– ברמת הshell-
התחלה
המשך
©צבי מלמד
202
טיפול בהרשאות – ברמת הshell-
** הדגמה **
©צבי מלמד
203
הפונקציה )( statלקבלת מידע על קובץ
©צבי מלמד
204
הפונקציה )( statלקבלת מידע על קובץ
• הפונקציה )כמו גם חברותיה( מקבלת מתאר קובץ או + path-name
מצביע למבנה .struct statממלאת את המבנה בנתונים אודות הקובץ.
• membersשל המבנה כוללים )בין היתר(:
– – mode_t st_modeסוג הקובץ )רגיל ,תיקייה ,soft-link ,וכו'( וכן
הרשאות הגישה לקובץ
– – off_t st_sizeגודל הקובץ בבתים
– a=access, m=modify, ) mode_t st_atime / st_mtime / st_ctime
– (c=creationהזמן בשניות של יוניקס.
• – createיצירת הקובץ או שינוי תכונותיו/הרשאותיו
– עוד חברים שנראה בדוגמא מיד
• בדיקת תכולת המבנה – באמצעות מאקרו'אים
©צבי מלמד
205
הפונקציה )( statלקבלת מידע על קובץ
©צבי מלמד
206
לקבלת מידע על קובץstat() הפונקציה
if (“my_file”, &fs) == -1) {
......
}
if (S_ISDIR(fs.st_mode))
puts("it is a dir") ;
else if (S_ISLNK(fs.st_mode))
puts("it is a soft link") ;
else if (S_FIFO(fs.st_mode))
puts("it is a soft link") ;
else if (S_ISREG(fs.st_mode))
puts("it is a normal file") ;
207
©צבי מלמד
לקבלת מידע על קובץstat() הפונקציה
במידת הצורך, בכדי לבדוק את ההרשאות )ואזstat • ניתן להשתמש בפונקציה
:( chmod() לעדכן אותן על ידי
if (“my_file”, &fs) == -1) {
......
}
if (! (S_IWGRP & fs.st_mode) {
// no group write permission
mode_t curr_mode =
fs.st_mode & ~S_IFMT;
// clean file type from st_mode
// remain only with permissions
mode_t new_mode = curr_mode | S_IWGRP;
// add the w permissions to g
if (chmod(“my_file” new_mode) == -1;) {
......
}
208
©צבי מלמד
הפונקציה )( statלקבלת מידע על קובץ
©צבי מלמד
209
דוגמאstat.c :
©צבי מלמד
210
דוגמאstat.c :
©צבי מלמד
211
הרצהstat.c :
©צבי מלמד
212
הרצהstat.c :
©צבי מלמד
213
דוגמאstat_link.c :
קריאה לפונקציה )(lstat
קריאה לפונקציה )(readlink
©צבי מלמד
214
דוגמאstat_link.c :
©צבי מלמד
215
דוגמאstat_link.c :
©צבי מלמד
216
שינוי שם קובץ /העברה לתיקייה אחרת
•
•
•
•
)if (rename(“file_name”, “new_name”) == -1
--- error --)if (rename(“file_name”, “/tmp/new_name”) == -1
--- error --אם הקובץ file_nameקיים ,אז ראשית הוא ימחק ואז יבוצע שינוי
השם
)if (unlink(“/tmp/new_name”) == -1
--- error --הקובץ ימחק אם לא קיים תהליך אחר שמשתמש בו.
אם משתמשים בו – הקובץ יימחק מהרשימה בתיקייה אבל ימחק
בפועל רק כשתתבצע סגירת הקובץ על ידי התהליך האחר
וכל זאת ..בתנאי ,שזהו הלינק האחרון לקובץ )(hard link
©צבי מלמד
217
יצירת קשר סימבולי soft link
if (symlink(“~david/bin/script_name”,
)“~/bin/my_script_name”) == -1
--- error --• יצירת soft-linkכפי שהכרנו בפקודה ln-s
• לא מתבצעת בדיקה שהקובץ ה"מוצבע" אכן קיים
©צבי מלמד
218
פעולות על תיקיות – קריאת תוכן התיקייה
•
•
•
•
•
תיקייה – קובץ בינארי שכולל טבלה בת שתי עמודות
בכדי לפתוח קובץFILE *fd = fopen(“myfile”, “r”); :
באופן דומה פתיחת התיקייה על ידי שימוש במשתנה מטיפוס DIR
כל כניסה/שורה בטבלת התיקייה :משתנה מטיפוס *(directory struct dirent
)entry
– החבר הרלבנטי– d_name :מכיל את שם הכניסה )לא את ה(path-
פתיחה וסגירה על ידי:
;)”DIR *dir = opendir(“~yoramb/os
if (dir == NULL) ...
................
)if (closedir(dir)==-1
--- error ---©צבי מלמד
219
פעולות על תיקיות – סריקת תוכן התיקייה
• לאחר שפתחנו את התיקייה נסרוק אותה על ידי:
;struct dirent *dentry
)while (dentry=readdir(dir)!=NULL
;)printf(“%s\n”, dentry->d_name
• הלולאה עוברת על תוכן התיקייה ,כולל ” “.וגם ""..
• לחזור לתחילת התיקייה:
;)rewinddir(dir
©צבי מלמד
220
man 2 readdir
221
©צבי מלמד
פעולות על תיקיות – שינוי הPWD-
• – PWDתיקיית העבודה הנוכחית )ברמת התהליך(
• נניח שהגדרנוchar pwd[N] :
• בכדי לקבל את המסלול המלא לתיקיית העבודה ,נבצע:
))if (!getcwd(pwd, N
--- error --• בכדי לשנות את תיקיית העבודה ,נבצע:
))”if (!chdir(“../..
--- error --• )עלינו לתיקיית "הסב" – כלומר ,שתי רמות בעץ התיקיות(
©צבי מלמד
222
יצירת ומחיקת מדריך
;)int mkdir(const char *path, mode_t mode
;)int rmdir(const char *path
• הפונקציה mkdirמנסה ליצור מדריך בשם המבוקש ,בעל ההרשאות
הרצויות.
– הרשאה מקובלת0700 :
– בתיקייה :דרוש הרשאת executeבכדי ליצור קובץ
• הפונקציה rmdirתנסה למחוק את התיקייה
– סיבות לכשלון :תיקייה איננה ריקה ,בשימוש של תהליך אחר,
חוסר הרשאות ,ועוד
©צבי מלמד
223
דוגמאscan_dir.c :
©צבי מלמד
224
דוגמאscan_dir.c :
©צבי מלמד
225
הרצהscan_dir.c :
©צבי מלמד
226
קבצים ממופים לזיכרון memory mapped files
• מיפוי קובץ לזיכרון מאפשר לקרוא/לכתוב על הקובץ ,באמצעות
פעולות על הזיכרון
• מטפלים בקובץ כאילו היה מערך של תוים
• יתרונות
– מקל על מספר תהליכים לטפל באותו קובץ.
• במידת הצורך – יפעילו סמפורים
– פעולות קריאה/כתיבה מתבצעות על ידי מצביע לזיכרון ולא על
ידי קריאות read/write
• מי מבצע אם כך את הקלט/פלט?
©צבי מלמד
227
קבצים ממופים לזיכרון memory mapped files
– הקלט/פלט מתבצע על ידי מערכת ההפעלה )אופטימליות
בביצוע(
– התכנית פונה לאזור של מערכת ההפעלה .נחסכת ההעתקת
הנתונים לחוצצים במרחב המשתמש
• ניתן למפות קובץ שגודלו על ) 2GBזה נכון ב 32-ביט ..יותר מכך ב
64ביט(
• לא ניתן להגדיל את הקובץ בשיטה הזאת .לשם כך דרושה פעולת
write
• כשמערכת ההפעלה מריצה תהליך )תכנית( היא פועלת בשיטה
הזאת :ממפה את הקובץ לזיכרון .טוענת דף ראשון .שאר הדפים
בשיטת דרישת הדפים.
©צבי מלמד
228
man 2 mmap
229
©צבי מלמד
קבצים ממופים לזיכרון memory mapped files
mmap1.c
©צבי מלמד
230
קבצים ממופים לזיכרון memory mapped files
mmap1.c
©צבי מלמד
231
קבצים ממופים לזיכרון memory mapped files
mmap1.c
©צבי מלמד
232
© Copyright 2025