亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
国产91清纯白嫩初高中在线观看| 日韩不卡一二三区| 国产精品免费视频网站| 亚洲日本在线a| 男女男精品视频| 国产美女精品在线| 粗大黑人巨茎大战欧美成人| 91视频一区二区| 欧美一区二区成人6969| 国产精品激情偷乱一区二区∴| 亚洲国产欧美一区二区三区丁香婷| 一区二区三区在线视频观看| 另类小说色综合网站| 色综合久久99| 国产女主播在线一区二区| 亚洲第一成人在线| 成人国产亚洲欧美成人综合网| 91精品国产91综合久久蜜臀| 国产精品久久久久影视| 久久成人免费日本黄色| 欧美日韩免费一区二区三区| 中文字幕精品一区| 老司机免费视频一区二区| 欧美日本乱大交xxxxx| 中文字幕一区二区三区色视频| 老汉av免费一区二区三区| 欧美性大战久久久久久久| 亚洲欧洲精品一区二区精品久久久 | 欧美在线观看视频一区二区三区| 日韩欧美在线网站| 欧美aⅴ一区二区三区视频| 91久久线看在观草草青青| 中文字幕中文在线不卡住| 国产精品一线二线三线精华| 欧美成人a在线| 黄色日韩网站视频| 欧美激情一区二区三区四区| 成人深夜视频在线观看| 久久九九影视网| 国产1区2区3区精品美女| 国产亚洲一区二区三区在线观看| 国产剧情在线观看一区二区 | 午夜精品久久久久久久蜜桃app| 欧洲精品视频在线观看| 婷婷一区二区三区| 日韩免费成人网| 国产一区二区三区日韩| 成人美女在线观看| 成人伦理片在线| 亚洲日本丝袜连裤袜办公室| 日本电影欧美片| 天天综合色天天综合色h| 亚洲国产成人av好男人在线观看| 99久久er热在这里只有精品15 | 麻豆精品在线看| 中文无字幕一区二区三区| 欧美日韩精品一区二区天天拍小说 | a在线播放不卡| 亚洲韩国一区二区三区| 国产清纯美女被跳蛋高潮一区二区久久w | 精品亚洲免费视频| 中文文精品字幕一区二区| 欧美一区二区三区在| 91玉足脚交白嫩脚丫在线播放| 麻豆91精品视频| 亚洲成人av在线电影| 国产精品天天看| 国产日韩欧美电影| 精品国产自在久精品国产| 欧美三级三级三级爽爽爽| 91色porny蝌蚪| 成人黄色电影在线 | 制服丝袜av成人在线看| 日本韩国视频一区二区| 99国产精品久久久久久久久久| 国产乱色国产精品免费视频| 日本va欧美va精品发布| 视频一区中文字幕国产| 一区二区激情小说| 亚洲成人你懂的| 日韩国产精品久久久| 日本午夜一区二区| 美日韩一级片在线观看| 日韩经典中文字幕一区| 日产国产欧美视频一区精品| 日韩中文字幕区一区有砖一区 | 欧美激情一区二区三区在线| 国产偷国产偷亚洲高清人白洁| 国产视频一区二区在线| 中文字幕中文乱码欧美一区二区| 国产精品美女久久久久久久久久久| 国产精品国模大尺度视频| 亚洲欧美日韩国产一区二区三区| 亚洲免费av在线| 日韩国产一区二| 国产精品77777竹菊影视小说| 成人性色生活片| 欧美日韩一区高清| 精品国产免费一区二区三区香蕉| 中文字幕一区二区三区四区不卡 | 欧美午夜宅男影院| 欧美大片在线观看| 亚洲欧美日韩国产一区二区三区| 亚洲成a人片在线不卡一二三区 | **性色生活片久久毛片| 日韩激情中文字幕| 一本大道av伊人久久综合| 日韩一区二区麻豆国产| 亚洲欧美自拍偷拍| 国内外精品视频| 欧美日韩大陆在线| 一区二区三区中文在线| 韩国成人在线视频| 欧美一区二区三区人| 洋洋成人永久网站入口| 白白色 亚洲乱淫| 久久久久久久网| 久久精品免费观看| 欧美丰满嫩嫩电影| 日日嗨av一区二区三区四区| 日本乱码高清不卡字幕| 国产精品动漫网站| 91在线观看一区二区| 自拍偷在线精品自拍偷无码专区| 极品少妇一区二区三区精品视频| 欧美一区二区三区性视频| 性感美女久久精品| 欧美电影免费观看高清完整版在线 | 成人免费看的视频| 亚洲少妇最新在线视频| 欧美一区二区美女| 一区二区三区在线观看欧美| 91污片在线观看| 国产精品日产欧美久久久久| 国产激情91久久精品导航| 26uuu国产电影一区二区| 久久99精品国产麻豆不卡| 91麻豆福利精品推荐| 中文无字幕一区二区三区 | 国产精品家庭影院| 91原创在线视频| 亚洲一区二区免费视频| 91精品国产色综合久久久蜜香臀| 国产精品对白交换视频| 99热在这里有精品免费| 亚洲婷婷在线视频| 国产传媒日韩欧美成人| 国产精品福利一区| 欧美日韩在线三区| 国产一区久久久| 精品国产一区二区三区av性色| 九色综合国产一区二区三区| 久久久久久亚洲综合影院红桃| 国产精一区二区三区| 欧美国产日产图区| 欧美视频在线不卡| 久久激情五月激情| 一区二区三区四区蜜桃| 日韩视频在线你懂得| 国产精品911| 天堂va蜜桃一区二区三区漫画版| 亚洲精品在线免费播放| 成人黄色在线网站| 久久电影网电视剧免费观看| 亚洲精品你懂的| 欧美国产欧美综合| 欧美高清性hdvideosex| 99re视频精品| 97se亚洲国产综合自在线| 亚洲va欧美va天堂v国产综合| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 欧美三级韩国三级日本一级| 成人小视频免费观看| 国产一区二区女| 免费在线观看不卡| 日本成人超碰在线观看| 香蕉影视欧美成人| 婷婷久久综合九色国产成人| 一区二区视频在线| 亚洲乱码国产乱码精品精98午夜| 最新高清无码专区| 综合久久综合久久| 自拍视频在线观看一区二区| 国产精品久久久爽爽爽麻豆色哟哟| 久久久久久久久久久99999| 日韩免费一区二区三区在线播放| 欧美午夜精品电影| 91网站在线观看视频| 91黄视频在线观看| 欧美日本在线一区| 日韩视频免费观看高清完整版在线观看 | 亚洲高清免费观看| 蜜臀av亚洲一区中文字幕| 精品在线亚洲视频| 国产永久精品大片wwwapp | 国产麻豆精品theporn| 成人在线视频首页| 欧美精品色综合| 国产日韩欧美麻豆| 亚洲一区免费在线观看|