红联Linux门户
Linux帮助

【FreeBSD操作系统设计与实现】注释-4.7-1

发布时间:2006-11-04 01:17:12来源:红联作者:wuhu911
Posting of a Signal

【A signal is posted to a single process with the psignal() routine or to a group of processes with the gsignal() routine. The gsignal() routine invokes psignal() for each process in the specified process group. 】
引用:
---------------------------------------------------------------------FreeBSD6.1
1449 /*
1450 * Send a signal to a process group.
1451 */
1452 void
1453 gsignal(pgid, sig)
1454 int pgid, sig;
1455 {
1456 struct pgrp *pgrp;
1457
1458 if (pgid != 0) {
1459 sx_slock(&proctree_lock);
1460 pgrp = pgfind(pgid);
1461 sx_sunlock(&proctree_lock);
1462 if (pgrp != NULL) {
1423 pgsignal(pgrp, sig, 0);
1464 PGRP_UNLOCK(pgrp);
1465 }
1466 }
1467 }
1468
1469 /*
1470 * Send a signal to a process group. If checktty is 1,
1471 * limit to members which have a controlling terminal.
1472 */
1473 void
1474 pgsignal(pgrp, sig, checkctty)
1475 struct pgrp *pgrp;
1476 int sig, checkctty;
1477 {
1478 register struct proc *p;
1479
1480 if (pgrp) {
1481 PGRP_LOCK_ASSERT(pgrp, MA_OWNED);
1482 LIST_FOREACH(p, &pgrp->pg_members, p_pglist) {
1483 PROC_LOCK(p);
1484 if (checkctty == 0 || p->p_flag & P_CONTROLT)
1485 psignal(p, sig);
1486 PROC_UNLOCK(p);
1487 }
1488 }
1489 }
---------------------------------------------------/usr/src/sys/kern/kern_sig.c

进程组的hash链表pgrphashtbl[]是由/sys/kern/kern_proc.c文件中定义的struct sx类型变量proctree_lock进行保护的,这是一个Shared/Exclusive类型的锁。如果需要对被保护对象执行读操作,则只需获得共享锁,且多个线程可同时请求对同一个对象的共享锁。如果需要对被保护对象执行写操作,则需要获得互斥锁。对于同一个对象,只能有一个线程持有其互斥锁。在gsignal()函数中,由于只是读取进程组hash链表中的内容,因此只需在读取前后获取和释放共享锁即可(1459、1461行)。

1460行根据进程组ID从进程组hash链表中找到进程组的指针,传给pgsignal()函数。pgsignal()函数遍历该进程组链表,对于链表上的每一个进程都调用psignal()函数发送相应信号。
文章评论

共有 0 条评论