亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? signal.c

?? Linux2.4.20針對三星公司的s3c2410開發板的內核改造。
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* *  linux/kernel/signal.c * *  Copyright (C) 1991, 1992  Linus Torvalds * *  1997-11-02  Modified for POSIX.1b signals by Richard Henderson */#include <linux/config.h>#include <linux/slab.h>#include <linux/module.h>#include <linux/unistd.h>#include <linux/smp_lock.h>#include <linux/init.h>#include <linux/sched.h>#include <linux/trace.h>#include <asm/uaccess.h>/* * SLAB caches for signal bits. */#define DEBUG_SIG 0#if DEBUG_SIG#define SIG_SLAB_DEBUG	(SLAB_DEBUG_FREE | SLAB_RED_ZONE /* | SLAB_POISON */)#else#define SIG_SLAB_DEBUG	0#endifstatic kmem_cache_t *sigqueue_cachep;atomic_t nr_queued_signals;int max_queued_signals = 1024;void __init signals_init(void){	sigqueue_cachep =		kmem_cache_create("sigqueue",				  sizeof(struct sigqueue),				  __alignof__(struct sigqueue),				  SIG_SLAB_DEBUG, NULL, NULL);	if (!sigqueue_cachep)		panic("signals_init(): cannot create sigqueue SLAB cache");}/* Given the mask, find the first available signal that should be serviced. */static intnext_signal(struct task_struct *tsk, sigset_t *mask){	unsigned long i, *s, *m, x;	int sig = 0;		s = tsk->pending.signal.sig;	m = mask->sig;	switch (_NSIG_WORDS) {	default:		for (i = 0; i < _NSIG_WORDS; ++i, ++s, ++m)			if ((x = *s &~ *m) != 0) {				sig = ffz(~x) + i*_NSIG_BPW + 1;				break;			}		break;	case 2: if ((x = s[0] &~ m[0]) != 0)			sig = 1;		else if ((x = s[1] &~ m[1]) != 0)			sig = _NSIG_BPW + 1;		else			break;		sig += ffz(~x);		break;	case 1: if ((x = *s &~ *m) != 0)			sig = ffz(~x) + 1;		break;	}		return sig;}static void flush_sigqueue(struct sigpending *queue){	struct sigqueue *q, *n;	sigemptyset(&queue->signal);	q = queue->head;	queue->head = NULL;	queue->tail = &queue->head;	while (q) {		n = q->next;		kmem_cache_free(sigqueue_cachep, q);		atomic_dec(&nr_queued_signals);		q = n;	}}/* * Flush all pending signals for a task. */voidflush_signals(struct task_struct *t){	t->sigpending = 0;	flush_sigqueue(&t->pending);}void exit_sighand(struct task_struct *tsk){	struct signal_struct * sig = tsk->sig;	spin_lock_irq(&tsk->sigmask_lock);	if (sig) {		tsk->sig = NULL;		if (atomic_dec_and_test(&sig->count))			kmem_cache_free(sigact_cachep, sig);	}	tsk->sigpending = 0;	flush_sigqueue(&tsk->pending);	spin_unlock_irq(&tsk->sigmask_lock);}/* * Flush all handlers for a task. */voidflush_signal_handlers(struct task_struct *t){	int i;	struct k_sigaction *ka = &t->sig->action[0];	for (i = _NSIG ; i != 0 ; i--) {		if (ka->sa.sa_handler != SIG_IGN)			ka->sa.sa_handler = SIG_DFL;		ka->sa.sa_flags = 0;		sigemptyset(&ka->sa.sa_mask);		ka++;	}}/* * sig_exit - cause the current task to exit due to a signal. */voidsig_exit(int sig, int exit_code, struct siginfo *info){	struct task_struct *t;	sigaddset(&current->pending.signal, sig);	recalc_sigpending(current);	current->flags |= PF_SIGNALED;	/* Propagate the signal to all the tasks in	 *  our thread group	 */	if (info && (unsigned long)info != 1	    && info->si_code != SI_TKILL) {		read_lock(&tasklist_lock);		for_each_thread(t) {			force_sig_info(sig, info, t);		}		read_unlock(&tasklist_lock);	}	do_exit(exit_code);	/* NOTREACHED */}/* Notify the system that a driver wants to block all signals for this * process, and wants to be notified if any signals at all were to be * sent/acted upon.  If the notifier routine returns non-zero, then the * signal will be acted upon after all.  If the notifier routine returns 0, * then then signal will be blocked.  Only one block per process is * allowed.  priv is a pointer to private data that the notifier routine * can use to determine if the signal should be blocked or not.  */voidblock_all_signals(int (*notifier)(void *priv), void *priv, sigset_t *mask){	unsigned long flags;	spin_lock_irqsave(&current->sigmask_lock, flags);	current->notifier_mask = mask;	current->notifier_data = priv;	current->notifier = notifier;	spin_unlock_irqrestore(&current->sigmask_lock, flags);}/* Notify the system that blocking has ended. */voidunblock_all_signals(void){	unsigned long flags;	spin_lock_irqsave(&current->sigmask_lock, flags);	current->notifier = NULL;	current->notifier_data = NULL;	recalc_sigpending(current);	spin_unlock_irqrestore(&current->sigmask_lock, flags);}static int collect_signal(int sig, struct sigpending *list, siginfo_t *info){	if (sigismember(&list->signal, sig)) {		/* Collect the siginfo appropriate to this signal.  */		struct sigqueue *q, **pp;		pp = &list->head;		while ((q = *pp) != NULL) {			if (q->info.si_signo == sig)				goto found_it;			pp = &q->next;		}		/* Ok, it wasn't in the queue.  We must have		   been out of queue space.  So zero out the		   info.  */		sigdelset(&list->signal, sig);		info->si_signo = sig;		info->si_errno = 0;		info->si_code = 0;		info->si_pid = 0;		info->si_uid = 0;		return 1;found_it:		if ((*pp = q->next) == NULL)			list->tail = pp;		/* Copy the sigqueue information and free the queue entry */		copy_siginfo(info, &q->info);		kmem_cache_free(sigqueue_cachep,q);		atomic_dec(&nr_queued_signals);		/* Non-RT signals can exist multiple times.. */		if (sig >= SIGRTMIN) {			while ((q = *pp) != NULL) {				if (q->info.si_signo == sig)					goto found_another;				pp = &q->next;			}		}		sigdelset(&list->signal, sig);found_another:		return 1;	}	return 0;}/* * Dequeue a signal and return the element to the caller, which is  * expected to free it. * * All callers must be holding current->sigmask_lock. */intdequeue_signal(sigset_t *mask, siginfo_t *info){	int sig = 0;#if DEBUG_SIGprintk("SIG dequeue (%s:%d): %d ", current->comm, current->pid,	signal_pending(current));#endif	sig = next_signal(current, mask);	if (sig) {		if (current->notifier) {			if (sigismember(current->notifier_mask, sig)) {				if (!(current->notifier)(current->notifier_data)) {					current->sigpending = 0;					return 0;				}			}		}		if (!collect_signal(sig, &current->pending, info))			sig = 0;						/* XXX: Once POSIX.1b timers are in, if si_code == SI_TIMER,		   we need to xchg out the timer overrun values.  */	}	recalc_sigpending(current);#if DEBUG_SIGprintk(" %d -> %d\n", signal_pending(current), sig);#endif	return sig;}static int rm_from_queue(int sig, struct sigpending *s){	struct sigqueue *q, **pp;	if (!sigismember(&s->signal, sig))		return 0;	sigdelset(&s->signal, sig);	pp = &s->head;	while ((q = *pp) != NULL) {		if (q->info.si_signo == sig) {			if ((*pp = q->next) == NULL)				s->tail = pp;			kmem_cache_free(sigqueue_cachep,q);			atomic_dec(&nr_queued_signals);			continue;		}		pp = &q->next;	}	return 1;}/* * Remove signal sig from t->pending. * Returns 1 if sig was found. * * All callers must be holding t->sigmask_lock. */static int rm_sig_from_queue(int sig, struct task_struct *t){	return rm_from_queue(sig, &t->pending);}/* * Bad permissions for sending the signal */int bad_signal(int sig, struct siginfo *info, struct task_struct *t){	return (!info || ((unsigned long)info != 1 && SI_FROMUSER(info)))	    && ((sig != SIGCONT) || (current->session != t->session))	    && (current->euid ^ t->suid) && (current->euid ^ t->uid)	    && (current->uid ^ t->suid) && (current->uid ^ t->uid)	    && !capable(CAP_KILL);}/* * Signal type: *    < 0 : global action (kill - spread to all non-blocked threads) *    = 0 : ignored *    > 0 : wake up. */static int signal_type(int sig, struct signal_struct *signals){	unsigned long handler;	if (!signals)		return 0;		handler = (unsigned long) signals->action[sig-1].sa.sa_handler;	if (handler > 1)		return 1;	/* "Ignore" handler.. Illogical, but that has an implicit handler for SIGCHLD */	if (handler == 1)		return sig == SIGCHLD;	/* Default handler. Normally lethal, but.. */	switch (sig) {	/* Ignored */	case SIGCONT: case SIGWINCH:	case SIGCHLD: case SIGURG:		return 0;	/* Implicit behaviour */	case SIGTSTP: case SIGTTIN: case SIGTTOU:		return 1;	/* Implicit actions (kill or do special stuff) */	default:		return -1;	}}		/* * Determine whether a signal should be posted or not. * * Signals with SIG_IGN can be ignored, except for the * special case of a SIGCHLD.  * * Some signals with SIG_DFL default to a non-action. */static int ignored_signal(int sig, struct task_struct *t){	/* Don't ignore traced or blocked signals */	if ((t->ptrace & PT_PTRACED) || sigismember(&t->blocked, sig))		return 0;	return signal_type(sig, t->sig) == 0;}/* * Handle TASK_STOPPED cases etc implicit behaviour * of certain magical signals. * * SIGKILL gets spread out to every thread.  */static void handle_stop_signal(int sig, struct task_struct *t){	switch (sig) {	case SIGKILL: case SIGCONT:		/* Wake up the process if stopped.  */		if (t->state == TASK_STOPPED)			wake_up_process(t);		t->exit_code = 0;		rm_sig_from_queue(SIGSTOP, t);		rm_sig_from_queue(SIGTSTP, t);		rm_sig_from_queue(SIGTTOU, t);		rm_sig_from_queue(SIGTTIN, t);		break;	case SIGSTOP: case SIGTSTP:	case SIGTTIN: case SIGTTOU:		/* If we're stopping again, cancel SIGCONT */		rm_sig_from_queue(SIGCONT, t);		break;	}}static int send_signal(int sig, struct siginfo *info, struct sigpending *signals){	struct sigqueue * q = NULL;	/* Real-time signals must be queued if sent by sigqueue, or	   some other real-time mechanism.  It is implementation	   defined whether kill() does so.  We attempt to do so, on	   the principle of least surprise, but since kill is not	   allowed to fail with EAGAIN when low on memory we just	   make sure at least one signal gets delivered and don't	   pass on the info struct.  */	if (atomic_read(&nr_queued_signals) < max_queued_signals) {		q = kmem_cache_alloc(sigqueue_cachep, GFP_ATOMIC);	}	if (q) {		atomic_inc(&nr_queued_signals);		q->next = NULL;		*signals->tail = q;		signals->tail = &q->next;		switch ((unsigned long) info) {			case 0:				q->info.si_signo = sig;				q->info.si_errno = 0;				q->info.si_code = SI_USER;				q->info.si_pid = current->pid;				q->info.si_uid = current->uid;				break;			case 1:				q->info.si_signo = sig;				q->info.si_errno = 0;				q->info.si_code = SI_KERNEL;				q->info.si_pid = 0;				q->info.si_uid = 0;				break;			default:				copy_siginfo(&q->info, info);				break;		}	} else if (sig >= SIGRTMIN && info && (unsigned long)info != 1		   && info->si_code != SI_USER) {		/*		 * Queue overflow, abort.  We may abort if the signal was rt		 * and sent by user using something other than kill().		 */		return -EAGAIN;	}	sigaddset(&signals->signal, sig);	return 0;}/* * Tell a process that it has a new active signal.. * * NOTE! we rely on the previous spin_lock to * lock interrupts for us! We can only be called with * "sigmask_lock" held, and the local interrupt must * have been disabled when that got acquired! * * No need to set need_resched since signal event passing * goes through ->blocked */static inline void signal_wake_up(struct task_struct *t){	t->sigpending = 1;#ifdef CONFIG_SMP	/*	 * If the task is running on a different CPU 	 * force a reschedule on the other CPU to make	 * it notice the new signal quickly.	 *	 * The code below is a tad loose and might occasionally	 * kick the wrong CPU if we catch the process in the	 * process of changing - but no harm is done by that	 * other than doing an extra (lightweight) IPI interrupt.	 */	if ((t->state == TASK_RUNNING) && (t->cpu != cpu()))		kick_if_running(t);#endif	if (t->state & TASK_INTERRUPTIBLE) {		wake_up_process(t);		return;	}}static int deliver_signal(int sig, struct siginfo *info, struct task_struct *t){	int retval = send_signal(sig, info, &t->pending);	if (!retval && !sigismember(&t->blocked, sig))		signal_wake_up(t);	return retval;}intsend_sig_info(int sig, struct siginfo *info, struct task_struct *t){	unsigned long flags;	int ret;#if DEBUG_SIGprintk("SIG queue (%s:%d): %d ", t->comm, t->pid, sig);#endif	ret = -EINVAL;	if (sig < 0 || sig > _NSIG)		goto out_nolock;	/* The somewhat baroque permissions check... */	ret = -EPERM;	if (bad_signal(sig, info, t))		goto out_nolock;	/* The null signal is a permissions and process existence probe.	   No signal is actually delivered.  Same goes for zombies. */	ret = 0;	if (!sig || !t->sig)		goto out_nolock;	spin_lock_irqsave(&t->sigmask_lock, flags);	handle_stop_signal(sig, t);	/* Optimize away the signal, if it's a signal that can be	   handled immediately (ie non-blocked and untraced) and	   that is ignored (either explicitly or by default).  */	if (ignored_signal(sig, t))		goto out;	/* Support queueing exactly one non-rt signal, so that we	   can get more detailed information about the cause of	   the signal. */	if (sig < SIGRTMIN && sigismember(&t->pending.signal, sig))		goto out;	TRACE_PROCESS(TRACE_EV_PROCESS_SIGNAL, sig, t->pid);	ret = deliver_signal(sig, info, t);out:	spin_unlock_irqrestore(&t->sigmask_lock, flags);out_nolock:#if DEBUG_SIGprintk(" %d -> %d\n", signal_pending(t), ret);#endif	return ret;}/* * Force a signal that the process can't ignore: if necessary * we unblock the signal and change any SIG_IGN to SIG_DFL. */intforce_sig_info(int sig, struct siginfo *info, struct task_struct *t){	unsigned long int flags;	spin_lock_irqsave(&t->sigmask_lock, flags);	if (t->sig == NULL) {		spin_unlock_irqrestore(&t->sigmask_lock, flags);		return -ESRCH;	}	if (t->sig->action[sig-1].sa.sa_handler == SIG_IGN)		t->sig->action[sig-1].sa.sa_handler = SIG_DFL;	sigdelset(&t->blocked, sig);	recalc_sigpending(t);	spin_unlock_irqrestore(&t->sigmask_lock, flags);	return send_sig_info(sig, info, t);}/* * kill_pg_info() sends a signal to a process group: this is what the tty * control characters do (^C, ^Z etc) */intkill_pg_info(int sig, struct siginfo *info, pid_t pgrp){	int retval = -EINVAL;	if (pgrp > 0) {		struct task_struct *p;		retval = -ESRCH;		read_lock(&tasklist_lock);		for_each_task(p) {			if (p->pgrp == pgrp && thread_group_leader(p)) {				int err = send_sig_info(sig, info, p);				if (retval)					retval = err;			}		}		read_unlock(&tasklist_lock);	}	return retval;}/* * kill_sl_info() sends a signal to the session leader: this is used * to send SIGHUP to the controlling process of a terminal when * the connection is lost. */intkill_sl_info(int sig, struct siginfo *info, pid_t sess){	int retval = -EINVAL;	if (sess > 0) {		struct task_struct *p;		retval = -ESRCH;		read_lock(&tasklist_lock);		for_each_task(p) {			if (p->leader && p->session == sess) {				int err = send_sig_info(sig, info, p);				if (retval)					retval = err;			}		}		read_unlock(&tasklist_lock);	}	return retval;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩国产影片| 亚洲精品乱码久久久久久日本蜜臀| 久久亚洲一级片| 亚洲欧美激情视频在线观看一区二区三区| 视频一区二区国产| 99久久夜色精品国产网站| 日韩欧美中文字幕一区| 亚洲精品日韩一| 国产电影一区二区三区| 欧美大尺度电影在线| 一卡二卡三卡日韩欧美| 成人一二三区视频| 欧美一级久久久| 亚洲在线视频网站| 日本乱码高清不卡字幕| 国产精品网友自拍| 国产精品一区二区在线观看不卡| 欧美三级日韩三级| 一区二区三区影院| 91玉足脚交白嫩脚丫在线播放| 欧美精品一区二区三区蜜臀 | 色狠狠一区二区| 中文字幕巨乱亚洲| 国产精品亚洲成人| 久久久久国产精品免费免费搜索| 麻豆免费精品视频| 欧美成人精精品一区二区频| 性久久久久久久久久久久| 色婷婷亚洲精品| 一区二区三区免费观看| 91高清在线观看| 亚洲欧美日韩中文字幕一区二区三区| 国产成人午夜视频| 国产精品家庭影院| 久久久久久久久蜜桃| 国内精品在线播放| 久久精品这里都是精品| 国产精品中文字幕一区二区三区| 久久久久青草大香线综合精品| 精品一区二区三区久久| 久久亚洲精精品中文字幕早川悠里 | 欧美人xxxx| 日韩影视精彩在线| 亚洲精品一区二区三区福利| 毛片av一区二区| 欧美电视剧在线看免费| 国产制服丝袜一区| 亚洲天堂中文字幕| 欧美日韩精品系列| 麻豆久久久久久| 国产日韩欧美a| 99久久精品免费观看| 亚洲地区一二三色| 26uuu欧美| 99热在这里有精品免费| 亚洲精品水蜜桃| 欧美日韩国产不卡| 国产乱码精品一区二区三区五月婷| 国产欧美精品在线观看| 欧美这里有精品| 激情久久久久久久久久久久久久久久| 国产人久久人人人人爽| 在线亚洲人成电影网站色www| 香蕉av福利精品导航 | 91国偷自产一区二区三区观看 | 国产日韩欧美电影| 色婷婷国产精品| 麻豆国产精品视频| **性色生活片久久毛片| 91精品国产欧美一区二区18 | 国产精品青草综合久久久久99| 91麻豆精品视频| 亚洲精品成a人| 色综合久久中文综合久久牛| 午夜电影久久久| 国产三级欧美三级| 欧美乱妇20p| 成人黄色软件下载| 麻豆精品视频在线| 亚洲影院理伦片| 国产女人18水真多18精品一级做| 欧美亚洲动漫另类| 成人免费观看视频| 美女视频黄 久久| 亚洲大片在线观看| 亚洲女同一区二区| 国产视频911| 日韩你懂的在线观看| 在线观看一区二区精品视频| 粉嫩嫩av羞羞动漫久久久| 奇米777欧美一区二区| 伊人婷婷欧美激情| 国产精品久久久久久久久果冻传媒 | 国产精品高潮呻吟久久| 日韩精品一区二区三区视频 | 欧美日韩精品一区二区| 9久草视频在线视频精品| 麻豆91精品91久久久的内涵| 亚洲一区二区三区小说| 自拍偷拍国产精品| 国产三级三级三级精品8ⅰ区| 日韩精品一区二区三区在线观看| 欧美在线免费视屏| 91视频精品在这里| 成人av网址在线| 成人在线视频首页| 国产乱码精品一区二区三区五月婷| 美女被吸乳得到大胸91| 免费三级欧美电影| 日韩国产一区二| 日韩1区2区3区| 日本伊人色综合网| 免费在线观看日韩欧美| 蜜桃一区二区三区在线| 免费在线观看一区二区三区| 香蕉成人伊视频在线观看| 午夜精品福利一区二区蜜股av| 亚洲一区视频在线观看视频| 亚洲综合一区在线| 午夜伊人狠狠久久| 天天综合网 天天综合色| 图片区日韩欧美亚洲| 美女视频网站黄色亚洲| 久久精品国产澳门| 国产精品一卡二| 成人免费视频app| 99精品视频在线免费观看| 91精彩视频在线| 欧美一区二区三区喷汁尤物| 日韩精品一区二区三区视频播放| 精品少妇一区二区三区免费观看 | 久久精品国产一区二区三 | 亚洲一区视频在线| 日韩在线a电影| 精品中文字幕一区二区小辣椒| 国产在线视频一区二区三区| 国产高清不卡一区二区| av在线不卡观看免费观看| 色视频成人在线观看免| 69av一区二区三区| 久久综合999| 亚洲男人的天堂av| 日本不卡在线视频| 国产成人av电影在线观看| 91免费版在线看| 91精品黄色片免费大全| 国产目拍亚洲精品99久久精品| 最新国产精品久久精品| 午夜伦理一区二区| 国产成人精品一区二| 91国在线观看| 久久久欧美精品sm网站| 一区二区三区四区国产精品| 亚洲1区2区3区视频| 国产91精品精华液一区二区三区| 日本久久电影网| 2023国产精华国产精品| 亚洲免费观看高清完整版在线 | 日韩精品中午字幕| 亚洲美女精品一区| 激情另类小说区图片区视频区| 色诱亚洲精品久久久久久| 日韩一区二区视频| 亚洲综合视频在线观看| 国产一区二区三区免费看| 欧美午夜影院一区| 国产色综合一区| 麻豆精品一区二区三区| 91玉足脚交白嫩脚丫在线播放| 精品电影一区二区| 日韩激情一二三区| 一本一本久久a久久精品综合麻豆| 日韩欧美三级在线| 天天影视涩香欲综合网| www.99精品| 国产欧美一区二区精品久导航 | 欧美一区二区人人喊爽| 亚洲人成在线播放网站岛国| 极品少妇xxxx精品少妇| 欧美精三区欧美精三区| 亚洲人成网站精品片在线观看| 韩国女主播一区二区三区| 欧美精品aⅴ在线视频| 亚洲欧美日韩国产成人精品影院| 国产成人啪午夜精品网站男同| 日韩三级在线观看| 日本一道高清亚洲日美韩| 欧美羞羞免费网站| 亚洲欧美国产毛片在线| 99久久精品免费看国产| 中文字幕一区二| 国产1区2区3区精品美女| 久久婷婷国产综合国色天香| 美女高潮久久久| 精品理论电影在线观看| 免费在线观看成人| 欧美一区二区视频在线观看2022| 亚洲1区2区3区视频| 欧美丰满嫩嫩电影| 午夜影院在线观看欧美|