Computer Assignment 2.pdf

‫ﺩﺭﺱ ﺳﻴﺴﺘﻢﻫﺎﯼ ﻋﺎﻣﻞ‬
‫)ﺩﻛﺘﺮ ﺟﻠﻴﻠﻲ(‬
‫ﭘﺎﻳﻴﺰ ‪۱۳۸۶‬‬
‫ﺗﻤﺮﻳﻦ ﮐﺎﻣﭙﻴﻮﺗﺮﯼ ‪۲‬‬
‫ﺗﺎﺭﻳﺦ ﺗﺤﻮﻳﻞ ‪ :‬ﺳﻪ ﺷﻨﺒﻪ ‪۱۳۸۶/۹/۲۰‬‬
‫ﻧﮑﺎﺕ ﻗﺎﺑﻞ ﺗﻮﺟﻪ‬
‫‪ .۱‬ﺗﻤﺮﻳﻦﻫﺎﯼ ﮐﺎﻣﭙﻴﻮﺗﺮﯼ ﺑﺎﻳﺪ ﺩﺭ ﮔﺮﻭﻩﻫﺎﯼ ﺩﻭ ﻧﻔﺮﻩ ﺍﻧﺠﺎﻡ ﺷﻮﺩ‪.‬‬
‫‪ .۲‬ﺑﺮﻧﺎﻣﻪﻫﺎ ﺑﺎﻳﺪ ﺩﺭ ﻣﺤﻴﻂ ﻟﻴﻨﻮﮐﺲ ﻭ ﺑﺎ ﺯﺑﺎﻥ ‪ C/C++‬ﻧﻮﺷﺘﻪ ﺷﻮﻧﺪ‪.‬‬
‫‪ .۳‬ﺍﺳﺘﻔﺎﺩﻩ ﺍﺯ ‪ Makefile‬ﺑﺮﺍﯼ ﺳﺎﺧﺖ ﺑﺮﻧﺎﻣﻪﻫﺎ ﺍﻟﺰﺍﻣﯽ ﺍﺳﺖ‪ .‬ﺍﻃﻼﻋﺎﺕ ﻣﺮﺑﻮﻁ ﺑﻪ ﻧﻮﺷﺘﻦ ‪ Makefile‬ﺩﺭ ﺑﺨﺶ‬
‫ﻣﻨﺎﺑﻊ ﻭﺏﺳﺎﻳﺖ ﺩﺭﺱ ﻣﻮﺟﻮﺩ ﺍﺳﺖ‪.‬‬
‫‪ .۴‬ﺗﻤﺎﺭﻳﻦ ﺑﺎﻳﺪ ﺗﺎ ﭘﺎﻳﺎﻥ ﻭﻗـﺖ ﺗﻌﻴـﻴﻦ ﺷـﺪﻩ‪ ،‬ﺑـﻪ ﺁﺩﺭﺱ ‪ [email protected]‬ﻓﺮﺳـﺘﺎﺩﻩ‬
‫ﺷﻮﻧﺪ‪.‬‬
‫‬
‫ﻋﻨﻮﺍﻥ ﻣﻴﻞ ‪CA2 :‬‬
‫‬
‫ﺫﮐﺮ ﻧﺎﻡ ﻭ ﻧﺎﻡ ﺧﺎﻧﻮﺍﺩﮔﯽ ﻭ ﺷﻤﺎﺭﻩ ﺩﺍﻧﺸﺠﻮﻳﻲ ﺩﺭ ﻣﺘﻦ ﻧﺎﻣﻪ ﺍﻟﺰﺍﻣﯽ ﺍﺳﺖ‪.‬‬
‫‬
‫ﻣﺘﻦ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﺻﻮﺭﺕ ‪ zip‬ﺷﺪﻩ ﻭ ﻓﺮﻣﺖ )‪ (family1_family2.zip‬ﭘﻴﻮﺳﺖ ﺷﻮﺩ‪.‬‬
‫‪ .۵‬ﺗﻨﻬــﺎ ﺩﺭ ﺻــﻮﺭﺕ ﺑــﺮﻭﺯ ﻣــﺸﻜﻞ ﺩﺭ ﻓﺮﺳــﺘﺎﺩﻥ ﺗﻤــﺎﺭﻳﻦ ﺑــﻪ ﺁﺩﺭﺱ ﻓــﻮﻕ‪ ،‬ﻣــﻲﺗﻮﺍﻧﻴــﺪ ﺁﻥ ﺭﺍ ﺑــﻪ ﺁﺩﺭﺱ‬
‫‪ [email protected]‬ﺑﻔﺮﺳﺘﻴﺪ‪.‬‬
‫ﺍﻟﻒ‪ .‬ﺍﺟﺮﺍﻱ ﺩﺳﺘﻮﺭﺍﺕ ﺧﺎﺭﺟﻲ )‪ (External Commands‬ﺩﺭ ﭘﻮﺳﺘﻪ )‪(Shell‬‬
‫ﻫﻤﺎﻧﻄﻮﺭ ﻛﻪ ﻣﻲﺩﺍﻧﻴﺪ‪ ،‬ﭘﻮﺳﺘﻪ ﻳﻚ ﺩﺳﺘﻪ ﺩﺳﺘﻮﺭﺍﺕ ﺩﺍﺧﻠﻲ ﻭ ﻳـﻚ ﺩﺳـﺘﻪ ﺩﺳـﺘﻮﺭﺍﺕ ﺧـﺎﺭﺟﻲ ﺩﺍﺭﺩ‪ .‬ﺩﺳـﺘﻮﺭﺍﺕ ﺩﺍﺧﻠـﻲ‬
‫ﺁﻧﻬﺎﻳﻲ ﻫﺴﺘﻨﺪ ﻛﻪ ﺗﻮﺳﻂ ﺧﻮﺩ ﭘﻮﺳﺘﻪ ﭘﻴﺎﺩﻩﺳﺎﺯﻱ ﻣﻲﺷﻮﻧﺪ ﻭ ﺩﺳﺘﻮﺭﺍﺕ ﺧﺎﺭﺟﻲ ﺁﻧﻬﺎﻳﻲﺍﻧﺪ ﻛﻪ ﻣﻮﺟـﺐ ﺍﺟـﺮﺍﻱ ﻣـﺴﺘﻘﻴﻢ‬
‫ﺑﺮﻧﺎﻣﻪﻫﺎﻱ ﺍﺟﺮﺍﻳﻲ ﺩﻳﮕﺮ ﻣﻲﺷﻮﻧﺪ‪ .‬ﺑﻪ ﭘﻮﺳﺘﻪﻱ ﻧﻮﺷﺘﻪ ﺷﺪﻩ ﺩﺭ ﺗﻤﺮﻳﻦ ﻛﺎﻣﭙﻴﻮﺗﺮﻱ ﺷﻤﺎﺭﻩﻱ ‪ ،۱‬ﺍﻣﻜﺎﻥ ﺍﺟـﺮﺍﻱ ﺩﺳـﺘﻮﺭﺍﺕ‬
‫ﺧﺎﺭﺟﻲ ﺭﺍ ﻧﻴﺰ ﺍﺿﺎﻓﻪ ﻛﻨﻴﺪ‪ .‬ﭘﻮﺳﺘﻪ ﺑﺎﻳﺴﺘﻲ ﺍﻣﻜﺎﻥ ﺍﺟﺮﺍﻱ ﺩﺳـﺘﻮﺭﺍﺕ ﺧـﺎﺭﺟﻲ ﺭﺍ ﺩﺭ ‪ background‬ﻫـﻢ ﺩﺍﺷـﺘﻪ ﺑﺎﺷـﺪ‪.‬‬
‫ﺑﺪﻳﻦ ﻣﻌﻨﺎ ﻛﻪ ﻭﻗﺘﻲ ﭘﻮﺳﺘﻪ ﺩﺭ ﺣﺎﻝ ﺍﺟﺮﺍﻱ ﻳﻚ ﺩﺳﺘﻮﺭ ﺍﺳﺖ‪ ،‬ﺑﺘﻮﺍﻧﺪ ﺑﺪﻭﻥ ﻣﻨﺘﻈﺮ ﻣﺎﻧﺪﻥ ﺑﺮﺍﻱ ﺍﺗﻤﺎﻡ ﺁﻥ‪ ،‬ﺩﺳﺘﻮﺭ ﺑﻌﺪﻱ ﺭﺍ‬
‫ﻧﻴﺰ ﺍﺟﺮﺍ ﻧﻤﺎﻳﺪ‪.‬‬
‫‪Example of executing normally:‬‬
‫‪/home/SHMB/‬‬
‫‪>> cmd arg1 arg2 … argn‬‬
‫‪>> cp –r /root/temp.txt‬‬
‫‪Example of executing in background:‬‬
‫& ‪>> cmd arg1 arg2 … argn‬‬
‫‪>> cp –r /root/temp.txt‬‬
‫& ‪/home/SHMB/‬‬
‫‪-١-‬‬
‫ﺭﺍﻫﻨﻤﺎﻳﻲ‪:‬‬
‫• ﻧﺴﺨﻪﻱ ﺳﻮﻡ ‪ man‬ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﻟﻴﻨﻮﻛﺲ ﻣﺮﺑﻮﻁ ﺑﻪ ﺩﺳﺘﻮﺭ ‪.(man 3 exec) exec‬‬
‫• ﻓﺎﻳﻞ ‪ man‬ﻣﺮﺑﻮﻁ ﺑﻪ ﺩﺳﺘﻮﺭ ‪.fork‬‬
‫• ﻣﻄﺎﻟﻌﻪﻱ ﻓﺼﻞ ‪ ۱۱‬ﻛﺘﺎﺏ ‪ ،Linux-Programming-Unleashed‬ﻗﺴﻤﺖ ‪System calls and‬‬
‫‪.library function‬‬
‫ﺏ‪ .‬ﺁﺷﻨﺎﻳﻲ ﺑﺎ ‪ IPC‬ﻭ ‪Signaling‬‬
‫ﻣﻲﺧﻮﺍﻫﻴﻢ ﻳﻚ ﺩﺳﺘﻮﺭ ﺩﺍﺧﻠﻲ ﺑﻪ ﻧﺎﻡ ‪ history‬ﺑﻪ ﭘﻮﺳﺘﻪﻱ ﺗﻤﺮﻳﻦ ‪ ۱‬ﺑﻴﻔﺰﺍﻳﻴﻢ ﻛﻪ ‪ N‬ﺩﺳﺘﻮﺭ ﺁﺧـﺮ ﺍﺟـﺮﺍ ﺷـﺪﻩ ﺗﻮﺳـﻂ‬
‫ﻛﺎﺭﺑﺮ ﺭﺍ ﺑﻪ ﻣﺎ ﻧﺸﺎﻥ ﻣﻲﺩﻫﺪ‪ .‬ﺑﻪ ﺩﻻﻳﻠﻲ ﻧﻤﻲﺧﻮﺍﻫﻴﻢ ﻛﻪ ﺍﻳﻦ ﻟﻴﺴﺖ ﺩﺳﺘﻮﺭﺍﺕ ﺩﺭ ﺧﻮﺩ ﭘﺮﺩﺍﺯﻩﻱ ‪ shell‬ﻧﮕﻬـﺪﺍﺭﻱ ﺷـﻮﺩ‪.‬‬
‫ﺑﻪ ﺟﺎﻱ ﺁﻥ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﻧﺎﻡ ‪ logger‬ﺑﺎﻳﺪ ﻧﻮﺷﺘﻪ ﺷﻮﺩ ﻛﻪ ﺍﻳـﻦ ﻟﻴـﺴﺖ ﺭﺍ ﺩﺭ ﺧـﻮﺩ ﻧﮕـﻪ ﺩﺍﺭﺩ ﻭ ﺳـﺮﻭﻳﺲﻫـﺎﻳﻲ ﺑـﺮﺍﻱ‬
‫ﺑﺎﺯﻳﺎﺑﻲ ﺁﻧﻬﺎ ﺍﺭﺍﺋﻪ ﺩﻫﺪ‪.‬‬
‫ﺑﻪ ﺍﻳﻦ ﻣﻨﻈﻮﺭ‪ ،‬ﺩﺭ ﺑﺮﻧﺎﻣﻪﻱ ﭘﻮﺳﺘﻪ‪ ،‬ﭘﺲ ﺍﺯ ﻫﺮ ﺩﺳﺘﻮﺭﻱ ﻛﻪ ﺗﻮﺳـﻂ ﻛـﺎﺭﺑﺮ ﺍﺟـﺮﺍ ﻣـﻲﺷـﻮﺩ‪ ،‬ﺑـﻪ ﺑﺮﻧﺎﻣـﻪﻱ ‪ logger‬ﻳـﻚ‬
‫ﺳﻴﮕﻨﺎﻝ )‪ (signal‬ﺑﻔﺮﺳﺘﻴﺪ ﻛﻪ ﺁﻥ ﺭﺍ ﺍﺯ ﻭﺟﻮﺩ ﻳﻚ ﺩﺭﺧﻮﺍﺳﺖ ﻣﻄﻠﻊ ﻛﻨﺪ‪ .‬ﺳﭙﺲ ﺑﺎ ﺍﺳﺘﻔﺎﺩﻩ ﺍﺯ ﻳﻜﻲ ﺍﺯ ﺭﻭﺵﻫـﺎﻱ ‪IPC‬‬
‫ﻣﺜﻞ ‪) pipe, shared memory, message passing, etc.‬ﺍﺯ ‪ socket programming‬ﺍﺳﺘﻔﺎﺩﻩ ﻧﻜﻨﻴﺪ(‪ ،‬ﻧﺎﻡ‬
‫ﺩﺳﺘﻮﺭ ﺭﺍ ﺑﻪ ‪ logger‬ﺑﻔﺮﺳﺘﻴﺪ‪ .‬ﺍﺯ ﻃﺮﻑ ﺩﻳﮕﺮ‪ ،‬ﺑﺮﻧﺎﻣﻪﻱ ‪ logger‬ﻣﻨﺘﻈﺮ ﻳﻚ ﺳﻴﮕﻨﺎﻝ ﻣـﻲﻣﺎﻧـﺪ )‪ (wait‬ﻭ ﻫﺮﮔـﺎﻩ ﻛـﻪ‬
‫ﻳﻚ ﺳﻴﮕﻨﺎﻝ ﺩﺭﻳﺎﻓﺖ ﻛﺮﺩ ﺑﺎ ﺍﺳﺘﻔﺎﺩﻩ ﺍﺯ ‪ ،IPC‬ﻧﺎﻡ ﺩﺳﺘﻮﺭ ﻓﺮﺳﺘﺎﺩﻩ ﺷﺪﻩ ﺭﺍ ﺩﺭﻳﺎﻓﺖ ﻣـﻲﻛﻨـﺪ ﻭ ﺩﺭ ﻳـﻚ ﺳـﺎﺧﺘﻤﺎﻥ ﺩﺍﺩﻩ‬
‫ﺫﺧﻴﺮﻩ ﻣﻲﻛﻨﺪ‪ .‬ﺑﺮﺍﻱ ﺳﺎﺩﮔﻲ ﺍﻳﻦ ﺳﺎﺧﺘﺎﺭ ﺩﺍﺩﻩ ﻓﺮﺽ ﻛﻨﻴﺪ ﻛﻪ ﺗﻌﺪﺍﺩ ﺩﺳﺘﻮﺭﺍﺕ ‪ history‬ﻣﺤﺪﻭﺩ ﺍﺳﺖ‪.‬‬
‫‪Example:‬‬
‫‪myshell >> ls‬‬
‫‪.‬‬
‫‪..‬‬
‫‪temp1‬‬
‫‪temp2‬‬
‫‪myshell >> cd temp1‬‬
‫‪myshell >> history‬‬
‫‪error: there is no logger process running in the system.‬‬
‫‪myshell >> ls‬‬
‫‪.‬‬
‫‪..‬‬
‫‪shell.cpp‬‬
‫‪shell.h‬‬
‫‪logger‬‬
‫‪myshell >> ./logger‬‬
‫‪myshell >> chertopert‬‬
‫‪error: no such file or directory or command‬‬
‫‪myshell >> cd ..‬‬
‫‪myshell >> ls‬‬
‫‪.‬‬
‫‪..‬‬
‫‪temp1‬‬
‫‪temp2‬‬
‫‪myshell >> history 10‬‬
‫‪chertopert‬‬
‫‪cd‬‬
‫‪ls‬‬
‫‪history‬‬
‫‪myshell >> history 3‬‬
‫‪ls‬‬
‫‪history‬‬
‫‪history‬‬
‫ﺭﺍﻫﻨﻤﺎﻳﻲ‪:‬‬
‫• ﭼﻮﻥ ﺧﻮﺩ ﭘﻮﺳﺘﻪ‪ ،‬ﺑﺮﻧﺎﻣﻪﻱ ‪ logger‬ﺭﺍ ﺍﺟﺮﺍ ﻣﻲﻛﻨﺪ‪ ،‬ﺑﻨﺎﺑﺮﺍﻳﻦ ﻣﻲﺗﻮﺍﻧﺪ ﺑﻪ ﺭﺍﺣﺘﻲ ‪ PID‬ﺁﻥ ﺭﺍ ﺑﺪﺳﺖ ﺁﻭﺭﺩ‪.‬‬
‫• ﻓﺎﻳﻞ ‪ man‬ﻣﺮﺑﻮﻁ ﺑﻪ ‪ fifo‬ﻭ ‪.(man fifo, man signal) signal‬‬
‫• ﻣﻄﺎﻟﻌﻪﻱ ﻗﺴﻤﺖﻫﺎﻱ ﻣﺮﺑﻮﻁ ﺑﻪ ‪ IPC‬ﺩﺭ ﻛﺘﺎﺏ ‪.Linux-Programming-Unleashed‬‬
‫‪-٢-‬‬