תרגול 7 תסריטים ניהול תהליכים ב -unix לי-טל משיח...

Post on 21-Dec-2015

249 Views

Category:

Documents

4 Downloads

Preview:

Click to see full reader

TRANSCRIPT

7תרגול

תסריטים

UNIXניהול תהליכים ב-

litalma@cs.technion.ac.ilלי-טל משיח

נערך והורחב ע'' ודים אייזנברג

(scriptתסריטים )קבצי

shellסדרה של פקודות סדרה של פקודות אשר מכילים קבציםקבצים•shellshellשפת ה-שפת ה-הכתובות ב תוכניותתוכניותמהווים מעין –

רגילקובץ טקסטקובץ טקסטנכתבים ב•ניתן להריץ אותם מספר פעמים–אין צורך בהידוראין צורך בהידור–

cleanלדוגמא, קובץ טקסט בשם •

22

echo “Cleaning !”rm *.omv ex1 ex1.old

הרצת תסריטים

sourcesourceדרך אחת - הפקודה •> source clean

cleanתריץ את התסריט תריץ את התסריט • מכיל את הפקודות מהשקף cleanבמידה וקובץ •

הקודם: !”Cleaning“תודפס הודעה –יימחקו כל קבצי אובייקט בתיקייה הנוכחית–ex1.old ישונה לקובץ ex1שם הקובץ –

33

C-shellשפת התסריטים לכל דברשפת תכנות שפת תכנות היא C-shellשפת התסריטים •

משתניםמשתנים–כולם מאותו טיפוס - מחרוזת או רשימה של מחרוזות•

פעולות אריתמטיותפעולות אריתמטיות–רק בשלמים•

ואחרות(while) לולאותלולאות–(if else)משפטי תנאי משפטי תנאי –: מסימן # ועד סוף השורה הערותהערות––,goto, switch בדומה לשפת בדומה לשפת ודברים אחריםCC

44

בשביל מה צריך עוד שפת בשביל מה צריך עוד שפת תכנות ???תכנות ???

התשובה בסוף התרגולהתשובה בסוף התרגול

C-shellניצול יכולות של

בכתיבת תסריטים ניתן להיעזר בכל היכולות של• C-shell: שלמדנו

משתנים––Alias Substitution–File name expansion–Command Substitution

•backticks ``

–I/O redirection–pipelining

• 55

C-shell: repeat לולאות ב-

•cshell מבצע את הפקודה command בדיוק count פעמים :

להריץ גם להריץ גם ניתן C-shellשימו לב שכל לולאה של • command linecommand line ב-ב-

66

repeat <count> <cshell command>repeat <count> <cshell command>

<repeat 3 echo Congratulations, Shifra !Congratulations, Shifra ! Congratulations, Shifra !Congratulations, Shifra !>

C-shell: while לולאות ב-

77

while (<expression>)while (<expression>)<cshell commands><cshell commands>

endend> source count100123456789

# count10 script:@ i = 0while ($i<10) echo $i @ i++end

C-shell: foreach לולאות ב-

הלולאה מתבצעת מספר פעמים השווה לגודל •listהרשימה

variableשל הלולאה, המשתנה בכל איטרציה בכל איטרציה •לפי הסדרמקבל ערך אחד מהרשימה מקבל ערך אחד מהרשימה

88

foreach <variable> (<list>)foreach <variable> (<list>)<cshell commands><cshell commands>

endend

foreach דוגמאות :

99

# final_vote scriptset number = 1foreach name (Itai Yossi Leon Einav Shifra) echo for $name send the number $number @ number++end

> source final_votefor Itai send the number 1for Yossi send the number 2for Leon send the number 3for Einav send the number 4for Shifra send the number 5

foreach דוגמאות :

בתיקייה הנוכחית:cיצירת העתק של כל קבצי •

1010

foreach FILE (*.c) cp $FILE $FILE.backend

(if ... else)משפטי תנאי :שתי גרסאותשתי גרסאות•

– if בלי פקודה אחתפקודה אחת עם ,else

if (<expression>) <one cshell command>if (<expression>) <one cshell command>– if אופציה ל-אופציה ל-ועם כמה פקודות כמה פקודות עםelseelse

if (<expression>) thenif (<expression>) then<cshell commands><cshell commands>

[else[else<cshell commands>]<cshell commands>]

endifendif

1111

בגרסה הזאת בגרסה הזאת thenthenחייבים חייבים

בגרסה הזאת בגרסה הזאת thenthenחייבים חייבים

endifendifוגם וגם

ifדוגמא של

if ($votes_for_yossi > $votes_for_shifra) thenecho Yossi won !

elseecho Shifra won !

endif

1212

ifתנאים בתוך משפטי השוואת מחרוזות:•

if ($winner == "Yossi") …if ($winner == "Yossi") …השוואת מספרים:•

if ($votes > 1000000) …if ($votes > 1000000) …C-shellתנאים מיוחדים ל-•

if (-d aaa) ...if (-d aaa) ... קיימת בתוך aaaבשם התיקייההתיקייה אם trueמשוערך ל-–

התיקייה הנוכחיתif (-f aaa) ...if (-f aaa) ...

קיים בתיקייה aaa בשם הקובץהקובץ אם trueמשוערך ל-–(והוא לא תיקייהוהוא לא תיקייההנוכחית )

1313

- התאמת ifתנאים בתוך משפטי מחרוזות

~= ~= אופרטור •המחרוזת בצד שמאל המחרוזת בצד שמאל אם trueמשוערך ל-–

תבנית בצד ימיןתבנית בצד ימיןמתאימה ל ][ כגון: *,? אוסימנים מיוחדים סימנים מיוחדים התבנית יכולה לכלול •

שמשמעותם תוארה בתרגול הקודם

!!~~של האופרטור ~= היא השלילההשלילה•

1414

:התאמה בין ifתנאים בתוך משפטי מחרוזות

!~, =~אופרטורים •

1515

> if (end_with_z =~ *[zZ]) echo match> if (end_with_z =~ *[zZ]) echo matchmatchmatch> if ("no point in string" !~ *.*) echo "no point"> if ("no point in string" !~ *.*) echo "no point"no pointno point> if ("point - . - in string" !~ *.*) echo "no point"> if ("point - . - in string" !~ *.*) echo "no point">>

ifאופרטורים בתוך משפטי סיכום:אופרטורים של השוואהאופרטורים של השוואה•

מספריםמספריםמשווים בין <, =>>, <, = –מחרוזותמחרוזותמשווים בין ~! ,==, =!, ~= –

גם להשוואה בין מספרים אך ==, =!ניתן להשתמש באופרטורים •ההשוואה תתבצע בין המחרוזות שמייצגות את המספרים

למה ישוערכו הביטויים הבאים ?–•8 =< 08 •8 => 08 •8 == 08 •8 == 8 •8 =! 08 •8 ~! 08 •8 ~= 08

1616

ifאופרטורים בתוך משפטי סיכום:

-,f-: קבצים ותיקיות קבצים ותיקיות לעבודה עם אופרטוריםאופרטורים•d

אופרטורים לוגיים להרכבת תנאיםאופרטורים לוגיים להרכבת תנאים•C !, &&, || כמו ב-–Cניתן להשתמש בסוגריים כמו ב-–

if (($winner == "Yossi") || ($winner == "Einav")) thenecho the Bublil family won !

endif

1717

switchמשפטי switch (<variable or string>)

case <pattern1>: <cshell commands> [breaksw]

case <pattern2>: <cshell commands>[breaksw]

... case <pattern_n>: <cshell commands>

[breaksw][default:

<cshell commands>]endsw

1818

התאמת התאמת מחרוזות כמו מחרוזות כמו

=~=~באופרטור באופרטור

: דוגמאswitchמשפטי switch($c) case "[a-z]": echo small letter breaksw case "[A-Z]": echo big letter breaksw case "[0-9]": echo digit breaksw case '$': echo dollar sign breaksw default: echo neither letter nor digitendsw

1919

gotoמשפטי

<:label>המסומן ב- קפיצה למקום קפיצה למקום מבצע •CCכמו ב-כמו ב-•

2020

goto >label<goto >label<

goto error...error:...

C וגם ב-C-Shellגם ב נחשב gotoשימוש ב-

לתכנות רע !משתמשים במנגנון

goto רק כשכל האלטרנטיבות האחרות

יותר גרועות

printfהפקודהprintf format stringsprintf format strings

formatלפי הפורמט לפי הפורמט stringsאת המחרוזות מדפיסהמדפיסה•.C ב-printfהפורמט דומה לפורמט של הפקודה –

תווי עריכהתווי עריכההפורמט יכול להכיל תווים רגילים או •דוגמאות של תווי עריכה:•

–%%ss מדפיסה את המחרוזת המתאימה מתוך הרשימה -strings.

– -]-[%]-[%m[.n]sm[.n]s מדפיסה את המחרוזת המתאימה מרשימתתווים, עם mmבאורך של באורך של המחרוזות כך שהתוצאה תהיה

)מתוך הגבלת מספר התווים המודפסיםהגבלת מספר התווים המודפסיםאפשרות לאלא מיושרת לימין מיושרת לימין . המחרוזת nnל - ל - המחרוזת הספציפית(

.--אם משתמשים באופרטור

- דוגמאותprintfהפקודה

יותר מחרוזותיותר מחרוזותשימו לב מה קורה כאשר ישנן שימו לב מה קורה כאשר ישנן ((ss)%)% מאשר תווי עריכהמאשר תווי עריכה stringsstringsברשימה ברשימה

> echo $HOME/home/rotics>> printf “My files are in %s\n“ $HOMEMy files are in /home/rotics>> printf “number is : %10.5s” 123456789anumber is: 12345>> printf “number is : #%-10.3s# %s\n” "123456789a“ xxxnumber is: #123 # xxx>> printf “My files are in %s\n“ $HOME “my PC”My files are in /home/roticsMy files are in my PC

הרצת תסריטים

:בשתי דרכיםבשתי דרכיםתסריטים להריץלהריץניתן •sourcesourceהפקודה הפקודה ע''י –

הנוכחי( shell)ב-מתבצע בסביבה הנוכחית מתבצע בסביבה הנוכחית התסריט •משתני הסביבה הנוכחיתמשתני הסביבה הנוכחיתיכול לשנות את •

ישירותישירות – חדש( shell)ב-בסביבה חדשה משלו בסביבה חדשה משלו התסריט מתבצע •משתני הסביבה הנוכחיתמשתני הסביבה הנוכחיתלא יכול לשנות את •

אלא אלא , בדרך השנייהבדרך השנייהלהריץ את התסריטים נהוגנהוג•לשנות את משתני הסביבה הנוכחיתלשנות את משתני הסביבה הנוכחיתרוצים אם אם

2323

הרצת תסריטים ישירות

לפני שמריצים תסריט בפעם הראשונה חייבים •הרשאת הרצההרשאת הרצהלתת לו

> chmod u+x myscript> chmod u+x myscript להריץלהריץאחרי שיש לקובץ הרשאת הרצה, ניתן •

: בצורה ישירהבצורה ישירהאותו > myscript> myscript

צריך להכיל את התיקיה pathכמובן המשתנה –הנוכחית, אחרת צריך להריץ בצורה הבאה:

> ./myscript> ./myscript

2424

הרצת קבצי סקריפט

לצורך חדש להפעיל חדש להפעיל shellshellאיזה איזה הנוכחי יידע -shellכדי שה•שורה ראשונה שורה ראשונה ביצוע התסריט, יש להוסיף לתסריט

יכולה להיות שונה המריץ המריץ shellshellכתובת ה-כתובת ה-במחשבים שונים •whichwhichניתן לברר מהי באמצעות הפקודה •

> which tcsh/bin/tcsh2525

#! /bin/tcsh -f#! /bin/tcsh -f

לא לבצע תסריטי לא לבצע תסריטיshellshellאומר ל-אומר ל- שיריץ את התסריט שיריץ את התסריטshellshellכתובת ה-כתובת ה-אתחול ולהתחיל יותר מהראתחול ולהתחיל יותר מהר

תסריטי אתחול

הם תסריטים מיוחדים אשר setup))תסריטי אתחול תסריטי אתחול •. בזמנים מסוימיםבזמנים מסוימיםע"י המערכת מורצים אוטומטית מורצים אוטומטית

–..loginlogin עם כניסה לחשבוןעם כניסה לחשבוןמבוצע–..cshrccshrc של כל בהתחלת הרצה בהתחלת הרצה מבוצע shell מסוג(C-Shell)

בהםנהוג להשתמש נהוג להשתמש • של סביבת העבודה. למשל,התאמה אישיתהתאמה אישיתל–

אתחול משתני סביבה נחוצים לעבודה•(alias)נתינת כינויים לפקודות •

בצורה אוטומטית בצורה אוטומטית שנרצה שיבוצעו משימותמשימותלביצוע – חדשshellבזמנים של כניסה לחשבון/פתיחת

2626

cshrc.דוגמא לתסריט

2727

set path = ($path .)alias cdex2 cd ~mtm/public/0809b/ex2alias gcc gcc -Wall -pedantic-errors -Werrorset savehist=1000

login.דוגמא לתסריט

2828

# welcome messageecho -------------- Welcome `whoami` ! -------------- echo You are in `pwd` directory of `hostname`echo OS is `uname -s`# echo disk usage is `du -sh | cut -f1`echo `who | wc -l` users are logged in

# print a warning about Matam assignmentset today = `date +%j`set assignment_day = 151set days_in_this_year = 365if( $today > $assignment_day) then @ remaining_days = $assignment_day + ($days_in_this_year - $today)else @ remaining_days = $assignment_day - $todayendifdateecho $remaining_days days until the submission of Matam assignment 2 !

העברת פרמטרים לתסריטים

לתסריטים בדומה להעביר פרמטרים להעביר פרמטרים ניתן •Cלהעברת פרמטרים לתוכנית

argv ניתן להתייחס לפרמטרים ע''י מערך Cב-–

ניתן להתייחס לפרמטרים C-Shell בתסריט •בצורה הבאה:

- הפקודה עצמה 0$0$––{${$nn}} או{${$argv[n]argv[n]}} -הפרמטר ה -n - רשימת כל הפרמטרים$*$*––#{$#{$argvargv}} -מספר הפרמטרים

2929

echo_scriptדוגמא:

3030

#! /bin/tcsh -fecho command: $0set number = 1foreach param ( $* ) echo parameter $number : $param @ number++end

> echo_script aaa bbb ccccommand: ./echo_scriptparameter 1 : aaaparameter 2 : bbbparameter 3 : ccc

> : אופרטור C-Shellקלט בשפת $>אופרטור • $< $

גורם לשורה שלמה להיקרא מערוץ הקלט הסטנדרטי –set line = “$<“

שורה שלמה אחת תיקרא מערוץ הקלט הסטנדרטי ותושם • בתור מחרוזת )כולל רווחים(lineלמשתנה

)(נהוג לבצע ישר המרה לרשימה על ידי שימוש ב-–set line = ($<)

line למשתנה ותושםותושם למילים תופרדתופרדמהקלט הסטנדרטי השורההשורה•בתור רשימה

אחרי הביצוע של השורה הזאת ניתן לבצע פעולות רגילות של •C-Shell : על רשימות $line[1], shift, ${#line}, $line[3-]'וכו

C-Shellב-לקרוא מקבצים לקרוא מקבצים וישירה אין דרך טבעית אין דרך טבעית •רק מהקלט הסטנדרטי–

3131

חלוקה פונקציונאלית של תסריטים

למודולים למודולים תוכניות לחלקלחלק למדנו Cבשפת •ופונקציותופונקציות

בקוד וכו'שימוש חוזר שימוש חוזר , קריאותקריאותלשיפור –

אין פונקציותאין פונקציות C-Shellבשפת •שמשתמש "התסריט הראשי" "התסריט הראשי" מחלקים תסריט ל–

"תסריטי עזר""תסריטי עזר"בכל "תסריט עזר" הוא תסריט בפני עצמו–

ניתן להריץ אותו בנפרד•הוא יכול להשתמש בתסריטים ותוכנות אחרות•

3232

תסריטים: העברת פרמטרים

בשורת הארגומנטיםבשורת הארגומנטים•

helper_script aaa bbb 17לתוך הערוץ הקלט הסטנדרטי pipelinepipelineב-ב-•

echo aaa bbb 17 | helper_scriptקובץ זמניקובץ זמנידרך •

echo aaa bbb 17 > tmphelper_script < tmp

3333

תסריטים: ערכי חזרה

backticksbackticksעל ידי •set result = `helper_script aaa bbb 17`

pipelinepipelineב-ב- לתסריט אחר העברה•helper_script aaa bbb 17 | another_script

קובץ זמניקובץ זמנידרך •

helper_script aaa bbb 17 > tmp

3434

קלט מקבצים

קלט קלט וישירה לקרוא דרך טבעית דרך טבעית C-shellב- כאמור, איןכאמור, אין•מקבציםמקבצים

הדרך הטבעית היא לקרוא שורות מערוץ הקלט הסטנדרטי על ידי –$>$>אופרטור אופרטור

לכן משתמשים בשיטה הבאה :•: לשני תסריטיםלשני תסריטיםאת משימת קריאת הקלט מחלקיםמחלקים–

"התסריט הראשי"•"תסריט העזר"•

לתסריט העזר: pipelinepipelineתוכן הקובץ ב-תוכן הקובץ ב-התסריט הראשי ישפוך את – cat file | helper_script

:הקלט הסטנדרטיהקלט הסטנדרטיישירות לערוץ יחבר את הקובץ יחבר את הקובץ או – helper_script < file

של תסריט העזרהקלט הסטנדרטי הקלט הסטנדרטי יועבר לערוץ תוכן הקובץ תוכן הקובץ •$> על ידי אופרטור יקרא מהקלט הסטנדרטייקרא מהקלט הסטנדרטיתסריט העזר –

3535

דוגמא

המכיל נתונים על שערים שהובקעו במשחקי המכיל נתונים על שערים שהובקעו במשחקי footballנתון קובץ נתון קובץ •כדורגל. כדורגל.

שהבקיע שהבקיע מספר השערים , , שם של שחקןכל שורה בקובץ מציינת כל שורה בקובץ מציינת •ושם בה הוא שיחק בה הוא שיחק שם הקבוצה מסוים, מסוים, תאריךבמשחק שנערך בבמשחק שנערך ב..הקבוצה היריבה

3636

>cat footballAlon Miz. 2 23/10/93 Macabi-Haifa Macabi-Tel-AvivIzak Zoh. 1 12/11/93 Macabi-Tel-Aviv Hapoel-Beer-ShevaRonen Ha. 3 27/12/93 Hapoel-Tel-Aviv Macabi-Tel-AvivReuven A. 2 12/11/93 Macabi-Haifa Hapoel-Tel-AvivEyal Ber. 1 20/11/93 Macabi-Haifa Macabi-Tel-Aviv Izak Zoh. 1 12/11/93 Macabi-Tel-Aviv Hapoel-HaifaAlon Miz. 2 26/10/93 Macabi-Haifa Beitar-JerusalemIzak Zoh. 2 12/12/93 Macabi-Tel-Aviv Macabi-HiafaAlon Miz. 2 23/12/93 Macabi-Haifa Macabi-Pet-TikvaRonen Ha. 3 27/11/93 Hapoel-Tel-Aviv Macabi-Haifa

דוגמא

. התסריטplayerברצוננו לכתוב תסריט בשם • של שחקן פרמטר שם מלאפרמטר שם מלאיקבל כ–מופיע מופיע בהן footballשל הקובץ השורותהשורותאת כל ידפיסידפיס –

שם השחקןשם השחקןשהוא סכום מספר השערים סכום מספר השערים את ידפיסידפיס ובנוסף –

הבקיע.

יהיה:.Alon Mizלדוגמא, הפלט עבור שורת הקלט •

3737

> player “Alon Miz.”Alon Miz. 2 23/10/93 Macabi-Haifa Macabi-Tel-AvivAlon Miz. 2 26/10/93 Macabi-Haifa Beitar-JerusalemAlon Miz. 2 23/12/93 Macabi-Haifa Macabi-Pet-Tikvatotal number of goals: 6

פתרון

לא נוכל לבצע קריאת קלט playerבתסריט •footballמהקובץ

calc_totalבשם ניעזר בתסריט אחר ניעזר בתסריט אחר ולכן –שבהם מופיע ישפוך את השורות ישפוך את השורות playerהתסריט –

calc_total ל-pipelinepipelineב-ב-השחקן – calc_total שבהם מופיע השחקן יקרא את שורות יקרא את שורות

$>$>ידי אופרטור ידי אופרטור מערוץ הקלט הסטנדרטי על

3838

פתרון

3939

< cat calc-total#! /bin/tcsh -fset line = ($<)set line = ($<)set sum = 0while (${#line} != 0)while (${#line} != 0) @ sum = $sum + $line[3] echo $line set line = ($<)set line = ($<)endendecho "total number of goals: $sum"

< cat player#! /bin/tcsh -fgrep "$1" football | calc-total

: : בפונט מודגשבפונט מודגשהתבנית התבנית

הכללית של הכללית של עיבוד הקלטעיבוד הקלט

דוגמא נוספת

scoresבשם תסריט לדירוג שחקנים תסריט לדירוג שחקנים עלינו לכתוב •מועברים כפרמטרים מועברים כפרמטרים המלאים של השחקנים השמותהשמות–

בשורת הפקודהמספר השערים מספר השערים של כל שחקן ייקבע על פי הדירוגהדירוג–

footballהנתונים המוכלים בקובץ הנתונים המוכלים בקובץ שהוא הבקיע לפי שני שחקנים שהבקיעו מספר זהה של שערים יקבלו דירוג •

זהה.

את ,דירוגודירוגועבור כל שחקן את ידפיסידפיסהתסריט •שהבקיעמספר השערים מספר השערים ואת שמו המלא שמו המלא

4040

footballתזכורת: קובץ

4141

>cat footballAlon Miz. 2 23/10/93 Macabi-Haifa Macabi-Tel-AvivAlon Miz. 2 23/10/93 Macabi-Haifa Macabi-Tel-AvivIzak Zoh. 1 12/11/93 Macabi-Tel-Aviv Hapoel-Beer-ShevaIzak Zoh. 1 12/11/93 Macabi-Tel-Aviv Hapoel-Beer-ShevaRonen Ha. 3 27/12/93 Hapoel-Tel-Aviv Macabi-Tel-AvivRonen Ha. 3 27/12/93 Hapoel-Tel-Aviv Macabi-Tel-AvivReuven A. 2 12/11/93 Macabi-Haifa Hapoel-Tel-AvivReuven A. 2 12/11/93 Macabi-Haifa Hapoel-Tel-AvivEyal Ber. 1 20/11/93 Macabi-Haifa Macabi-Tel-Aviv Eyal Ber. 1 20/11/93 Macabi-Haifa Macabi-Tel-Aviv Izak Zoh. 1 12/11/93 Macabi-Tel-Aviv Hapoel-HaifaIzak Zoh. 1 12/11/93 Macabi-Tel-Aviv Hapoel-HaifaAlon Miz. 2 26/10/93 Macabi-Haifa Beitar-JerusalemAlon Miz. 2 26/10/93 Macabi-Haifa Beitar-JerusalemIzak Zoh. 2 12/12/93 Macabi-Tel-Aviv Macabi-HiafaIzak Zoh. 2 12/12/93 Macabi-Tel-Aviv Macabi-HiafaAlon Miz. 2 23/12/93 Macabi-Haifa Macabi-Pet-TikvaAlon Miz. 2 23/12/93 Macabi-Haifa Macabi-Pet-TikvaRonen Ha. 3 27/11/93 Hapoel-Tel-Aviv Macabi-HaifaRonen Ha. 3 27/11/93 Hapoel-Tel-Aviv Macabi-Haifa

דוגמא להפעלת התסריט

4242

> scores "Alon Miz." "Izak Zoh." "Ronen Ha." "Reuven A."1 Alon Miz. 61 Ronen Ha. 62 Izak Zoh. 43 Reuven A. 2

פתרון

4343

> cat scores#! /bin/tcsh -f#! /bin/tcsh -f@ i = 1@ i = 1while ) $i >= ${#argv} (while ) $i >= ${#argv} ( grep "${argv[$i]}" football | calc_score <<! tempgrep "${argv[$i]}" football | calc_score <<! temp @ i++@ i++endendsort -n -k 3 -r temp | calc_placesort -n -k 3 -r temp | calc_placeif )-f temp( thenif )-f temp( then rm -f temprm -f tempendifendif

פתרון

4444

< cat calc_place#! /bin/tcsh -fset line = ($<)set place = 1@ goals = $line[3]while (${#line} != 0) if )$goals != $line[3]( then @ place++ @ goals = $line[3] endif echo "$place $line" set line = ($<)end

< cat calc_score#! /bin/tcsh -fset line = ($<)set sum = 0set player_name = )$line[1-2](while (${#line} != 0) @ sum = $sum + $line[3] set line = ($<)endecho "$player_name $sum"

C-shell לעומת C

שפת תסריטיםשפת תסריטים היא C-shellשפת • (scripting languagescripting language)

קיימות שפות תסריטים מתקדמות יותר:– Perl, Tcl, PHP, JavaScript, Python, Ruby

מזל טוב! למדתם שפת התסריטים מזל טוב! למדתם שפת התסריטים •הראשונה שלכם!הראשונה שלכם!

4545

C-shell לעומת C

שפת תכנות מערכתשפת תכנות מערכת היא Cשפת • (system languagesystem language)

קיימות שפות תכנות מערכת מתקדמות יותר:– C++, Java, C#

4646

C לעומת C-shellיתרונות של אחרותקל להריץ תוכניותקל להריץ תוכניות•

להעביר פרמטרים–לשלב פלט של תוכניות–לשלב בין תוכניות– שבה יש הרבה תוכניות סטנדרטיותUnixיתרון גדול בסביבת –

(sort, grep,cut)קבציםקבצים נוחה עם עבודה•מחרוזותמחרוזותעבודה נוחה עם •משתנים ותסריטי עזרמשתנים ותסריטי עזרעבודה נוחה עם •

לא צריך להגדיר טיפוסים, להכריז על משתנים ופונקציות–!בזמן קצר יותר בזמן קצר יותר תוכניות לפתחלפתחניתן •

קצרה יותר קצרה יותר 5יכולה להיות פי בשפת תסריטים בשפת תסריטים תוכנית שכתובה –Cבשפת מאותה התוכנית שכתובה

4747

C לעומת C-shellחסרונות של

- קל להכניס באגיםפחות בטיחותית פחות בטיחותית השפה •אין בדיקות טיפוסים–לא חייבים להגדיר משתנים לפני השימוש בהם–לדוגמא, איפה הבאג בקוד הבא ? –

מה יודפס בסוף הריצה שלו ?•

4848

set deposits = ($*)set account_balance = 100foreach d ($deposits) @ acount_balance = $account_balance + $dendecho $account_balance

C לעומת C-shellחסרונות של

יכול C-shellשל תוכנית שכתובה ב-זמן ביצוע זמן ביצוע •לעומת אותה פי כמה מאות ארוך יותר פי כמה מאות ארוך יותר להיות

Cהתוכנית שכתובה ב-

4949

C לעומת C-shellשימוש ב-

כאשרC-shellמשתמשים ב-•לא קריטיזמן ביצוע –

למשל כאשר המשימה מספיק קטנה כך שזמן הביצוע •לא מורגש

לא קריטיתאיכות התוכנה –או שהתכנית מספיק קטנה כדי שיהיה אפשר למצוא בה •

את כל הבאגים בצורה קלה

כאשרCמשתמשים ב-•חשובזמן ביצוע –היא קריטיתאיכות התוכנה איכות התוכנה –

5050

Unixבקרת תהליכים ב-

Unixתהליכים ב-

•Unix מספר מספר היא מערכת הפעלה המסוגלת לשרתרב של משתמשים בו זמניתרב של משתמשים בו זמנית

בו זמנית מספר רב של בו זמנית מספר רב של כל משתמש יכול להריץ –תהליכיםתהליכים

כהרצה של תוכנית כלשהי תהליךתהליךניתן לראות •יכולים להתקיים במקביל מספר תהליכים שכולם –

מריצים את אותה התוכנית

תהליך יכול•תהליכים נוספים ליצורליצור– תהליך שיצר להרוגלהרוג–לתהליכים אחריםלשלוח הודעות לשלוח הודעות –

5252

תהליכים בקורס מת''מ

במת''מ לא נלמד כיצד תהליכים מבצעים את •כל הפעולות הנ"ל

נשאיר זאת לקורס במערכות הפעלה– יכולמשתמשמשתמשנלמד כיצד –

מספר תהליכיםליצורליצור•

על אופן ביצועםלשלוטלשלוט•

תהליכיםלהרוגלהרוג•

5353

מצבים של תהליכים

(foregroundforeground) בחזיתבחזיתריצה •יכול לרוץ בחזיתתהליך אחד תהליך אחד רק –לקרוא מהמקלדתלקרוא מהמקלדתרק התהליך בחזית יכול –עד סיום נעלם נעלם promptpromptה-ה-כשהמשתמש מריץ תהליך בחזית –

התהליךלא ניתן להריץ פקודות נוספות•

(backgroundbackground) ברקעברקעריצה •מספר תהליכים בו זמניתמספר תהליכים בו זמניתברקע יכולים לרוץ –לא יכול לקרוא מהמקלדתלא יכול לקרוא מהמקלדתתהליך שרץ ברקע – חוזר חוזרpromptpromptה-ה-כשהמשתמש מריץ תהליך ברקע –

ניתן להריץ פקודות נוספות•

השעיההשעיה•עד שיעבירו אותו למצב ריצה נעצרנעצרהתהליך –

5454

יצירת תהליכים

הקשת שם של הקשת שם של יוצרים תהליכים על ידי •להרצה בשורת הפקודה:התוכנית התוכנית

בחזית–

ברקעברקע–

5555

> command &> command2 &> command&>

> command

בדיקת מצב תהליכים

jobsjobsהפקודה •

מספרי תהליךמספרי תהליךהמספרים בסוגריים מרובעים מציינים –מזהים תהליכים בשביל הפקודות לטיפול בתהליכים•

התהליך ה"נוכחי" התהליך ה"נוכחי" סימן ה-"+" מייצג את –לפקודות לטיפול בתהליכיםברירת המחדל ברירת המחדל •

5656

>jobs>jobs[1] + Running command[1] + Running command[2] - Running command2[2] - Running command2[3] Running command[3] Running command

השעיית תהליך

הפקודה•jobIDאת התהליך שמספרו משעהמשעה–

התהליך בחזיתהתהליך בחזיתאת משעהמשעה - Ctrl-zהקשת •

5757

stop stop [%jobID]

> command> commandCtrl-zCtrl-z[1] + Suspended command[1] + Suspended command<<

>jobs>jobs[1] + Running command[1] + Running command[2] - Running command2[2] - Running command2> stop %1> stop %1>jobs>jobs[1] + Suspended (signal) command[1] + Suspended (signal) command[2] - Running command2[2] - Running command2>>

העברת תהליך לחזית

הפקודה•לחזיתלחזית jobIDאת התהליך שמספרו מעבירהמעבירה–

5858

fgfg [%jobID] [%jobID]

> more try_input.c> more try_input.cmain()main(){{ char str[20];char str[20]; printf("I shall try to eat something");printf("I shall try to eat something"); scanf(“%s" , str);scanf(“%s" , str); printf(“Ate %s" , str);printf(“Ate %s" , str);}}

> try_input&> try_input&[1] 828[1] 828> I shall try to eat something> I shall try to eat something[1] + Suspended (tty input) try_input[1] + Suspended (tty input) try_input> jobs> jobs[1] + Suspended (tty input) try_input[1] + Suspended (tty input) try_input> fg %1> fg %1try_inputtry_inputcookiescookiesAte cookiesAte cookies> >

העברת תהליך לרקע

הפקודה•לרקעלרקע jobIDאת התהליך שמספרו מעבירהמעבירה–

5959

bgbg [%jobID [%jobID]

>jobs>jobs[1] + Suspended (signal) command[1] + Suspended (signal) command[2] - Running command2[2] - Running command2> bg %1> bg %1>jobs>jobs[1] Running command[1] Running command[2] + Running command2[2] + Running command2> >

הריגת תהליך

הפקודה•jobIDאת התהליך שמספרו הורגתהורגת–

התהליך בחזית התהליך בחזיתאתהורגת הורגת - Ctrl-cהקשת •

6060

kill -9kill -9 %jobID %jobID

> command> commandCtrl-cCtrl-c<<

>jobs>jobs[1] + Running command[1] + Running command[2] - Running command2[2] - Running command2> kill -9 %2> kill -9 %2>jobs>jobs[1] + Running command[1] + Running command[2] Terminated command2[2] Terminated command2>>

תרשים המצבים של תהליך

6161

חזיתחזית

רקערקע

השעיההשעיה

סיוםסיום

Ctrl-zCtrl-z

Ctrl-cCtrl-c

fgfg

fgfg

stopstop

killkill

killkill

bgbg

top related