作业系统设计与实作报告.doc_第1页
作业系统设计与实作报告.doc_第2页
作业系统设计与实作报告.doc_第3页
作业系统设计与实作报告.doc_第4页
作业系统设计与实作报告.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

作业系统设计与实作报告摘要:作业系统设计与实作报告主题:Signal成员:吴正敏 陈信瑜 张简光哲 郭闵嘉 李俊岳.UNIX中有几种历史悠久的处理程序间通讯机制(IPC,Inter-process communication),.关键词:系统,报告作业系统,报告类别:论文报告来源:牛档搜索(Niudown.COM)本文系牛档搜索(Niudown.COM)根据用户的指令自动搜索的结果,文中内涉及到的资料均来自互联网,用于学习交流经验,作品其著作权归原作者所有。不代表牛档搜索(Niudown.COM)赞成本文的内容或立场,牛档搜索(Niudown.COM)不对其付相应的法律责任!作業系統設計與實作報告主題:Signal成員:吳正敏 陳信瑜 張簡光哲 郭閔嘉 李俊岳 盧穎志 林勝尉一、 背景UNIX中有幾種歷史悠久的處理程序間通訊機制(IPC、Inter-process communication),Signal是其中之一。系統核心利用Signal來通知處理程序某些事件發生了。使用者通常利用Signal來放棄執行某個處理程序或將交談式的程式切換到某個狀態。所以說Signal是software interrupts。Signal很早就有了,像早期的Unix版本,不過那時有提供的Signal並不可靠(像Version 7),直到4.3BSD和SVR3做了一些改變,加入了reliable signals。可惜的是兩者彼此並不相容。但幸運的,POSIX.1有提供了標準化的signal 函式。Signal的編號在不同的UNIX版本有不同的設定,表一是Linux的編號方式,大致是合乎POSIX的標準。表一: Signal表列Singal nameNumberFunctionSIGHUP1hangupSIGINT 2interruptSIGQUIT 3quitSIGILL4illegal instructionSIGTRAP5trace trapSIGABRT6abort (generated by abort(3) routine)SIGIOT6Input/Output Trap (obsolete)SIGBUS7bus errorSIGFPE8arithmetic exceptionSIGKILL9kill (cannot be caught, blocked, or ignored)SIGUSR110user-defined signal 1SIGSEGV11segmentation violationSIGUSR212user-defined signal 2SIGPIPE13write on a pipe or other socket with no one to read itSIGALRM14alarm clockSIGTERM15software termination signalSIGTKFLT16SIGCHLD17child status has changedSIGCONT18continue after stopSIGSTOP19stop (cannot be caught, blocked, or ignored)SIGTSTP20stop signal generated from keyboardSIGTTIN21background read attempted from control terminalSIGTTOU22background write attempted to control terminalSIGURG23urgent condition present on socketSIGXCPU24cpu time limit exceeded (see getrlimit(2)SIGXFSZ25file size limit exceeded (see getrlimit(2)SIGVTALRM26virtual time alarm (see getitimer(2)SIGPROF27profiling timer alarm (see getitimer(2)SIGWINCH28window changed (see termio(4) and win(4S)SIGIO,SIGPOLL29I/O is possible on a descriptor (see fcntl(2V)SIGPWR 30Power Failure (for UPS)SIGUNUSED31二、 資料結構struct task_struct /* these are hardcoded - dont touch */volatile long state;/* -1 unrunnable, 0 runnable, 0 stopped */long counter;long priority;unsigned long signal;unsigned long blocked;/* bitmap of masked signals */unsigned long flags;/* per process flags, defined below */int errno;long debugreg8; /* Hardware debugging registers */struct exec_domain *exec_domain;/* various fields */struct linux_binfmt *binfmt;struct task_struct *next_task, *prev_task;struct task_struct *next_run, *prev_run;unsigned long saved_kernel_stack;unsigned long kernel_stack_page;int exit_code, exit_signal;/* ? */unsigned long personality;int dumpable:1;int did_exec:1;/* shouldnt this be pid_t? */int pid;int pgrp;int tty_old_pgrp;int session;/* boolean value for session group leader */int leader;intgroupsNGROUPS;/* * pointers to (original) parent process, youngest child, younger sibling, * older sibling, respectively. (p-father can be replaced with * p-p_pptr-pid) */struct task_struct *p_opptr, *p_pptr, *p_cptr, *p_ysptr, *p_osptr;struct wait_queue *wait_chldexit;/* for wait4() */unsigned short uid,euid,suid,fsuid;unsigned short gid,egid,sgid,fsgid;unsigned long timeout, policy, rt_priority;unsigned long it_real_value, it_prof_value, it_virt_value;unsigned long it_real_incr, it_prof_incr, it_virt_incr;struct timer_list real_timer;long utime, stime, cutime, cstime, start_time;/* mm fault and swap info: this can arguably be seen as either mm-specific or thread-specific */unsigned long min_flt, maj_flt, nswap, cmin_flt, cmaj_flt, cnswap;int swappable:1;unsigned long swap_address;unsigned long old_maj_flt;/* old value of maj_flt */unsigned long dec_flt;/* page fault count of the last time */unsigned long swap_cnt;/* number of pages to swap on next pass */* limits */struct rlimit rlimRLIM_NLIMITS;unsigned short used_math;char comm16;/* file system info */int link_count;struct tty_struct *tty; /* NULL if no tty */* ipc stuff */struct sem_undo *semundo;struct sem_queue *semsleeping;/* ldt for this task - used by Wine. If NULL, default_ldt is used */struct desc_struct *ldt;/* tss for this task */struct thread_struct tss;/* filesystem information */struct fs_struct *fs;/* open file information */struct files_struct *files;/* memory management info */struct mm_struct *mm;/* signal handlers */struct signal_struct *sig;#ifdef _SMP_int processor;int last_processor;int lock_depth;/* Lock depth. We can context switch in and out of holding a syscall kernel lock. */#endifstruct signal_struct /*在task structure 中有*sig */int count;struct sigaction action32;struct sigaction _sighandler_t sa_handler;/* SIG_DFL,(代表該訊號的標準處理常式) SIG_IGN, (代表忽略該訊或 */sigset_t sa_mask;/* signals在執行handler時被block */unsigned long sa_flags;/*SA_ONSTACK:在signal的堆疊裡SA_INTERRUPT:在signal return的時候不可以重新開始系統 SA_RESETHAND:當得到signal時重新設定handler成SIG_DFL SA_NOCLDSTOP:在child stop的時候不要送SIGCHLD */void (*sa_restorer)(void);三、 流程圖四、 詳細分析System callkill(int pid, int sig)送出編號sig的signal給一個process或是同一群組的一些process,規則如下:pid 0:process把signal送給編號pid的process。pid = 0:process把signal送給同一組的所有porcess。pid = -1:process把signal送給所有process,除了system process和自己。pid 偵測有無錯誤,如果count=0 return errorn 335-336:若pid0,則signal送給編號為pid的processkill_pg(int pgrp, int sig, int priv)用來送signal給groupn 264-265:判斷是否合法,sig必須在132間且pgrp(process group id)要比0大否則signal值是錯誤的。n 266-273:若process的group id是pgrp則會送出signal給它,send_sig如果成功會回傳0。n 274:判斷是否有傳送成功,found=0表示沒找到process回傳error found0,return 0。kill_proc(int pid, int sig, int priv)送signal給processn 305-306:sig要在132之間n 307-310:若有找到process的pid則送signal sig給它,sent sig如果成功會回傳0。n 311:如果找不到任何process回傳errorsend_sig(unsigned long sig,struct task_struct * p,int priv)n 7576:p不能是空的(p表要接受signal的process)而且sig不能大於32,因為singal只有32種,所以只要p為null或是sig大於32,function便會return -EINVAL (-EINVAL表示invalid sig)n 77:看看是normal process還是super user,且檢查signal是否為SIGCONT,如果是的話再看要接收signal的process是否跟目前正在執行的process在同一個session裡(currentsession 表正在執行的process,psession表示要接收的process)。n 7879:檢查傳送signal的process的effective user ID和接收signal的process的saved setuser ID是否match1n 80:檢查是否為super usern 81:如果以上的條件均成立,則return -EPERM(表示no privilege)n 8283:如果sig 0,則表示沒有送ignal,就直接returnn 8788:如果psig 0,則表沒收到signal,便直接returnn 8991:先看sig是否為SIGKILL或是SIGCONT(SIGCONT表示讓程式繼續執行),如果是的話再看pstate(程式狀態)是否為TASK_STOPPED(工作停止),是的話則執行wake_up_process因為signal指示為SIGCONTn 92:將pexit_code設為0n 9395:將SIGSTOP、SIGTSTP(Z)、SIGTTIN、SIGTTOU reset,也就是將這四個sugnal disable掉,因為之前的判斷得知現在的signal是要讓process繼續執行程式,所以要將會停止執行的signal disablen 9697:同理,如果signal為SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU,就把SIGCONT disablegenerate(unsigned long sig, struct task_struct * p)n 31:建立一個signal的maskn 32:將sa設為psigactionsig1n 39:確定signal沒有被block住還有process沒有被trace,因為如果上述條件成立,則能確定要接受signal的process會馬上處理signaln 41-42:如果sa_handler為SIG_IGN且sig不為SIGCHLD(child status has changed)就return。n 44-46:如果sa_handler為SIG_DFL(default action)以及之後四個條件有一成立,則return。但default不處理n 48:將signal設定起來n 49:若接收signal的行程為可中斷,則此signal不會被blockn 50:則把那個行程喚醒force_sig(unsigned long sig, struct task_struct * p)n 59:將signal的編號減(把132號轉成第031個位置)n 60:如果p是在zombie狀態,則不做任何事n 61:宣告一個UL(unsigned long:32bit)的值1,向左shift sign個位置後,把值設給maskn 62:將sa這個指標,指向正確的handler起始位置n 63:將signal的第sig個bit設成1(與mask做or)n 64:將blocked的第sig個bit設成0(與mask做and)n 65:若sa_handler的flag為ignoren 66:則把它改成default handlern 67:若process的state為可中斷n 68:則wake up processkill_sl(int sess, int sig, int priv)n 288:sig的值要在132之間(這裡的source code好像有問題,sig0 or sig=0?)n 289:若不在範圍內,回傳錯誤n 290:檢查每個process,看是不是session leadern 292:若是session leader,則送sig給session leader(call send_sig())n 294:用found來累計session leader個數n 298:若found 0 則正常結束,否則回傳錯誤代碼註:for_each_task()定義在SCHED.H, line 491屬於Kernal的function.System callsigaction(int sig, struct sigaction *act, *oact)函式sys_sigaction()是sys_signal()的最新且具有擴充功能的版本,它可用來更精確地指定欲採用的訊號處理常式。我們必須在new所代表的結構中填入新的處理常式的位地,如果old的值不等於NULL,舊的常式的任址將會填入old所代所的結構中。實作是檢查和改變signal action (取代signal()。signal()的routine不是NULL,則會被return回去。用法:sigaction(int signum, const struct sigaction * action, struct sigaction * oldaction)中signum指的是signal number,定義在signal.h裡;action指的是新的action, oldaction指的是舊的action。如果act不為NULL,則代表指定了新的signal處理函式給sig所指定的signal。而如果oact不為0則把舊的處理函式存到這裡。Exp:sigaction(SIGHUP,&new_action,NULL);把SIGHUP的signal handler改成new_action裡的handler。System call sigprocmask(int how, sigset_t *set, *oset)如果只要管制暫緩處理的遮罩時,我們可以使用sigprocmask(). 但SIGKILL, SIGSTOP 是不能暫緩處理的,如在被generate時正好被block,那SIGFPE, SIGKILL, SIGSEGV將沒有被定義。用法:sigpromask (int how, sigset_t *set, sigset_t *oset)中how指的是遮罩方式,而set為一signal mask,oset則是用來存舊的singal mask的地方。Exp:sigaction(SIG_SETMASK,&new_set,NULL);是把目前的signal_mask用new_set來取代。System call sigpending(sigset_t *set)可用來檢查處理程序是否有待處理的訊號,這些待處理的訊號會被標記在set中,而傳回值為零。 用法:sigpending(sigset_t *set)中set是用來標明那些待處理的signals。如果成功Sigpending()把待處理訊號標明在變數set中,而回傳0。Exp:sigpending(&singal_set);取得目前待處的訊號,標明在set裡。System call ssetmask(sigset_t mask), sgetmask(void)分別可用來取得或設定暫緩處理的訊號遮罩。回傳值都是回傳呼叫此二函式時的signal mask值(ssetmask指的是未改變的signal mask)。而mask傳遞的是要改變的signal mask值,當一個signal在mask中的對應bit被設定,則這估signal將被blocked住。前者只是傳回current-blocked,後者先把SIGKILL級SIGSTOP從傳給它的遮罩中刪除,所得的結果再填入處理程序結構System call sigsuspend(const sigset_t *se

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论