XINU
kill.c
Go to the documentation of this file.
1 
5 #include <xinu.h>
6 
32 {
33  intmask mask; /* Saved interrupt mask */
34  struct procent *prptr; /* Ptr to process's table entry */
35  int32 i; /* Index into descriptors */
36 
37  mask = disable();
38  if (isbadpid(pid) || (pid == NULLPROC) || ((prptr = &proctab[pid])->prstate) == PR_FREE)
39  {
40  restore(mask);
41  return SYSERR;
42  }
43 
44  if (--prcount <= 1)
45  { /* Last user process completes */
46  xdone();
47  }
48 
49  send(prptr->prparent, pid);
50  for (i = 0; i < 3; i++)
51  {
52  close(prptr->prdesc[i]);
53  }
54  freestk(prptr->prstkbase, prptr->prstklen);
55 
56  switch (prptr->prstate)
57  {
58  case PR_CURR:
59  prptr->prstate = PR_FREE; /* Suicide */
60  resched();
61 
62  case PR_SLEEP:
63  case PR_RECTIM:
64  unsleep(pid);
65  prptr->prstate = PR_FREE;
66  break;
67 
68  case PR_WAIT:
69  semtab[prptr->prsem].scount++;
70  /* Fall through */
71 
72  case PR_READY:
73  getitem(pid); /* Remove from queue */
74  /* Fall through */
75 
76  default:
77  prptr->prstate = PR_FREE;
78  }
79 
80  restore(mask);
81  return OK;
82 }
pid32 prparent
このプロセスを作成したプロセスID(親プロセスID)。
Definition: process.h:102
#define PR_RECTIM
プロセスが「タイムアウト」か「メッセージの到着」のいずれか早い方で待機中の状態。
Definition: process.h:49
void restore(intmask)
int32 prcount
現在アクティブのプロセス。
Definition: initialize.c:30
#define PR_READY
プロセスが準備完了(READY)状態。
Definition: process.h:39
全てのシステムヘッダファイルをインクルードする。
#define isbadpid(x)
プロセスIDを検証する。割り込みが無効になっている事を想定している。
Definition: process.h:71
#define SYSERR
処理が失敗した場合
Definition: kernel.h:79
syscall close(did32)
Definition: close.c:9
#define OK
処理が成功した場合
Definition: kernel.h:77
syscall send(pid32, umsg32)
プロセスにメッセージを送信し、受信側が待機状態の場合はREADY状態にする。
Definition: send.c:21
syscall kill(pid32 pid)
指定のプロセスを終了させ、システムから終了させたプロセス情報を取り除く。
Definition: kill.c:31
syscall unsleep(pid32)
Definition: unsleep.c:11
#define NULLPROC
NULLプロセスのID。NULLプロセスは、他に動かすプロセスがない時に動く空プロセス
Definition: process.h:54
uint32 prstklen
Bytesで表されたスタックの長さ(最大値。Byte)。
Definition: process.h:96
#define PR_CURR
プロセスが現在動作中。
Definition: process.h:37
#define PR_SLEEP
プロセスが休眠中(タイマー待機中)の状態。
Definition: process.h:43
sid32 prsem
プロセスが待機しているセマフォ。
Definition: process.h:100
char * prstkbase
ランタイムスタックの基点(メモリ領域で最上位のアドレス)。
Definition: process.h:94
uint32 intmask
保存された割り込みマスク
Definition: kernel.h:38
int16 prdesc[NDESC]
プロセス用のデバイスディスクリプタ
Definition: process.h:108
int int32
符号あり32ビット整数(int)
Definition: kernel.h:11
uint16 prstate
プロセス状態(PR_CURR, ..., etc)。
Definition: process.h:88
#define PR_FREE
プロセステーブルエントリが使用されていない状態。
Definition: process.h:35
void resched(void)
最優先の適切なプロセスにCPU実行権を渡す。
Definition: resched.c:22
pid32 getitem(pid32)
キューの任意の位置からプロセスを取り出す。
Definition: getitem.c:51
void xdone(void)
最終プロセスの終了時、システム終了メッセージを表示する。
Definition: xdone.c:10
struct procent proctab[]
プロセステーブル。
Definition: initialize.c:23
int32 syscall
システムコール関数 返り値の型
Definition: kernel.h:47
int32 pid32
プロセスID
Definition: kernel.h:26
プロセステーブル(32bitsの倍数)。
Definition: process.h:85
int32 scount
セマフォカウント(負の値(-N)の場合は、キューにN個の待機プロセスがある。それ以外はキューが空である) ...
Definition: semaphore.h:24
#define freestk(p, len)
getstk()で割り当てたスタックメモリを解放する。
Definition: memory.h:46
struct sentry semtab[]
セマフォテーブルエントリのextern宣言
Definition: initialize.c:25
#define PR_WAIT
プロセスがセマフォ上で待機中の状態。
Definition: process.h:47
intmask disable(void)
割り込み禁止(intr.Sに定義がある)