ubuntu下,也就是linux下,通常会用kill -事件编号实现。 你查一下LINUX下的事件就明白了。
kill 进程号 实现上是发了一个信号给指定的进程。 在python里,也可以加载事件处理模块,处理来自其它程序发过来的信号, 当然你可以用KILL工具发信号过来。
ctrl+d也是一个信号,ctrl+c也是一个。具体信号编码我不记得了。不过以前我做多进程管理时就是使用这个方法。 好象信号还可以带参数过来。
你打开python的帮助。看看signal这个模块。我把它的例子拿过来。对你有用不
import signal, osdef handler(signum, frame):
print 'Signal handler called with signal', signum
raise IOError("Couldn't open device!")
# Set the signal handler and a 5-second alarm
signal.signal(signal.SIGALRM, handler)
signal.alarm(5)
# This open() may hang indefinitely
fd = os.open('/dev/ttyS0', os.O_RDWR)
signal.alarm(0) # Disable the alarm
下面是我找到的一些资料。也许有用。
信号的概念
信号(signal)-- 进程之间通讯的方式,是一种软件中断。一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号。
几个常用信号:
SIGINT 终止进程 中断进程 (control+c)
SIGTERM 终止进程 软件终止信号
SIGKILL 终止进程 杀死进程
SIGALRM 闹钟信号
进程结束信号 SIGTERM和SIGKILL的区别
SIGTERM比较友好,进程能捕捉这个信号,根据您的需要来关闭程序。在关闭程序之前,您可以结束打开的记录文件和完成正在做的任务。在某些情况下,假如进程正在进行作业而且不能中断,那么进程可以忽略这个SIGTERM信号。
对于SIGKILL信号,进程是不能忽略的。这是一个 “我不管您在做什么,立刻停止”的信号。假如您发送SIGKILL信号给进程,Linux就将进程停止在那里。
发送信号一般有两种原因:
1(被动式) 内核检测到一个系统事件.例如子进程退出会像父进程发送SIGCHLD信号.键盘按下control+c会发送SIGINT信号
2(主动式) 通过系统调用kill来向指定进程发送信号
linux *** 作系统提供的信号
[100003@oss235 myppt]$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
Python提供的信号
Python 2.4.3 (#1, Jun 11 2009, 14:09:58)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>import signal
>>>dir(signal)
['NSIG', 'SIGABRT', 'SIGALRM', 'SIGBUS', 'SIGCHLD', 'SIGCLD',
'SIGCONT', 'SIGFPE', 'SIGHUP', 'SIGILL', 'SIGINT', 'SIGIO', 'SIGIOT',
'SIGKILL', 'SIGPIPE', 'SIGPOLL', 'SIGPROF', 'SIGPWR', 'SIGQUIT',
'SIGRTMAX', 'SIGRTMIN', 'SIGSEGV', 'SIGSTOP', 'SIGSYS', 'SIGTERM',
'SIGTRAP', 'SIGTSTP', 'SIGTTIN', 'SIGTTOU', 'SIGURG', 'SIGUSR1',
'SIGUSR2', 'SIGVTALRM', 'SIGWINCH', 'SIGXCPU', 'SIGXFSZ', 'SIG_DFL',
'SIG_IGN', '__doc__', '__name__', 'alarm', 'default_int_handler',
'getsignal', 'pause', 'signal']
*** 作系统规定了进程收到信号以后的默认行为
但是,我们可以通过绑定信号处理函数来修改进程收到信号以后的行为
有两个信号是不可更改的SIGTOP和SIGKILL
绑定信号处理函数
import os
import signal
from time import sleep
def onsignal_term(a,b):
print '收到SIGTERM信号'
#这里是绑定信号处理函数,将SIGTERM绑定在函数onsignal_term上面
signal.signal(signal.SIGTERM,onsignal_term)
def onsignal_usr1(a,b):
print '收到SIGUSR1信号'
#这里是绑定信号处理函数,将SIGUSR1绑定在函数onsignal_term上面
signal.signal(signal.SIGUSR1,onsignal_usr1)
while 1:
print '我的进程id是',os.getpid()
sleep(10)
运行该程序。然后通过另外一个进程来发送信号。
发送信号
发送信号的代码如下:
import os
import signal
#发送信号,16175是前面那个绑定信号处理函数的pid,需要自行修改
os.kill(16175,signal.SIGTERM)
#发送信号,16175是前面那个绑定信号处理函数的pid,需要自行修改
os.kill(16175,signal.SIGUSR1)
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#include <fakekey/fakekey.h>
#include <X11/keysym.h>
Display* disp
FakeKey *fk
GtkWidget *win = NULL
static char *numkeyboard_display[]=
{
"1\0", "2\0", "3\0", "+","4\0", "5\0", "6\0","-", "7\0", "8\0", "9\0", ".", "0\0", "←\0", "→\0", "Backspace\0", "Delete\0", "Enter\0"
}
static gushort numkeyboard_send[] =
{
XK_1, XK_2, XK_3, XK_plus, XK_4, XK_5, XK_6, XK_minus, XK_7, XK_8, XK_9, XK_period, XK_0, XK_Left, XK_Right, XK_BackSpace, XK_Delete, XK_Return
}
gboolean numbt_release (GtkWidget *widget, GdkEventButton *event,
gpointer user_data)
{
gint i = GPOINTER_TO_UINT(user_data)
fakekey_press_keysym(fk, numkeyboard_send[i], 0)
fakekey_release(fk)
return TRUE
}
void clicked_callback(GtkButton *button1, GtkWindow *window)
{
gint j
GtkWidget *button[5]
GtkWidget *vbox = gtk_vbox_new(FALSE, 5)
GtkWidget *hbox[5]
if(win)
{
gtk_widget_destroy (win)
win = NULL
}
else
{
win = gtk_window_new (GTK_WINDOW_POPUP)
hbox[0] = gtk_hbox_new(TRUE, 5)
for (j = 0 j <4j++ ) {
button[0] = gtk_button_new_with_label (numkeyboard_display[j])
gtk_box_pack_start_defaults(GTK_BOX(hbox[0]), button[0])
g_signal_connect(G_OBJECT(button[0]), "button-release-event",
G_CALLBACK(numbt_release), GUINT_TO_POINTER (j))
}
gtk_box_pack_start_defaults(GTK_BOX(vbox), hbox[0])
hbox[1] = gtk_hbox_new(TRUE, 5)
for (j = 4 j <8j++ ) {
button[1] = gtk_button_new_with_label (numkeyboard_display[j])
gtk_box_pack_start_defaults(GTK_BOX(hbox[1]), button[1])
g_signal_connect(G_OBJECT(button[1]), "button-release-event",
G_CALLBACK(numbt_release), GUINT_TO_POINTER (j))
}
gtk_box_pack_start_defaults(GTK_BOX(vbox), hbox[1])
hbox[2] = gtk_hbox_new(TRUE, 5)
for (j = 8 j <12j++ ) {
button[2] = gtk_button_new_with_label (numkeyboard_display[j])
gtk_box_pack_start_defaults(GTK_BOX(hbox[2]), button[2])
g_signal_connect(G_OBJECT(button[2]), "button-release-event",
G_CALLBACK(numbt_release), GUINT_TO_POINTER (j))
}
gtk_box_pack_start_defaults(GTK_BOX(vbox), hbox[2])
hbox[3] = gtk_hbox_new(TRUE, 5)
for (j = 12 j <15j++ ) {
button[3] = gtk_button_new_with_label (numkeyboard_display[j])
gtk_box_pack_start_defaults(GTK_BOX(hbox[3]), button[3])
g_signal_connect(G_OBJECT(button[3]), "button-release-event",
G_CALLBACK(numbt_release), GUINT_TO_POINTER (j))
}
gtk_box_pack_start_defaults(GTK_BOX(vbox), hbox[3])
hbox[4] = gtk_hbox_new(TRUE, 5)
for (j = 15 j <18j++ ) {
button[4] = gtk_button_new_with_label (numkeyboard_display[j])
gtk_box_pack_start_defaults(GTK_BOX(hbox[4]), button[4])
g_signal_connect(G_OBJECT(button[4]), "button-release-event",
G_CALLBACK(numbt_release), GUINT_TO_POINTER (j))
}
gtk_box_pack_start_defaults(GTK_BOX(vbox), hbox[4])
gtk_container_add(GTK_CONTAINER(win), vbox)
gtk_window_move (GTK_WINDOW (win), 200, 200)/* 设置窗口位置 */
gtk_widget_show_all(win)
}
}
int main(int argc, char *argv[])
{
GtkWidget *window
GtkWidget *button
GtkWidget *entry
GtkWidget *vbox
gtk_init(&argc, &argv)
window = gtk_window_new(GTK_WINDOW_TOPLEVEL)
gtk_window_set_title(GTK_WINDOW(window), "KeyBoard")
gtk_window_set_default_size(GTK_WINDOW(window),400,300)
disp = XOpenDisplay(NULL)//屏幕按键函数改成为内核驱动代发
if( disp == NULL )
return 1
fk = fakekey_init(disp)
vbox = gtk_vbox_new(FALSE, 5)
button = gtk_button_new_with_label("d出键盘")
gtk_widget_set_size_request(GTK_WIDGET(button),400,250)
gtk_box_pack_start_defaults(GTK_BOX(vbox), button)
entry = gtk_entry_new()
gtk_box_pack_start_defaults(GTK_BOX(vbox), entry)
gtk_widget_set_size_request(GTK_WIDGET(entry),400,50)
g_signal_connect(GTK_OBJECT(window), "destroy",G_CALLBACK(gtk_main_quit), NULL)
g_signal_connect(GTK_OBJECT(button), "clicked",G_CALLBACK(clicked_callback), window)
gtk_container_add(GTK_CONTAINER(window), vbox)
gtk_widget_show_all(window)
gtk_main()
return 0
}
Linux概述 Linux是一个成熟而稳定的网络 *** 作系统。将Linux植入嵌入式设备具有众多的优点。首先,Linux的源代码是开放的,任何人都可以获取并修改,用之开发自己的产品。其次,Lirmx是可以定制的,其系统内核最小只有约134kB。一个带有中文系统和图形用户界面的核心程序也可以做到不足1MB,并且同样稳定。另外,它和多数Unix系统兼容,应用程序的开发和移植相当容易。同时,由于具有良好的可移植性,人们已成功使Linux运行于数百种硬件平台之上。 然而,Linux并非专门为实时性应用而设计,因此如果想在对实时性要求较高的嵌入式系统中运行Linux,就必须为之添加实时软件模块。这些模块运行的内核空间正是 *** 作系统实现进程调度、中断处理和程序执行的部分,因此错误的代码可能会破坏 *** 作系统,进而影响整个系统的可靠性和稳定性。Linux的众多优点还是使它在嵌入式领域获得了广泛的应用,并出现了数量可观的嵌入式Linux系统。 Linux的不足 由于在现在的个人电脑 *** 作系统行业中,微软的Windows系统仍然占有大部分的份额,绝大多数的软件公司都支持Windows。这使得Windows上的应用软件应有尽有,而其他的 *** 作系统就要少一些。许多用户在换 *** 作系统的时候都会考虑以前的软件能否继续使用,换了 *** 作系统后是否会不方便。虽然Linux具有DOS、Windows模拟器,可以运行一些Windows程序,但Windows系统极其复杂,模拟器所模拟的运行环境不可能完全与真实的Windows环境一模一样,这就使得一些软件无法正常运行。 许多硬件设备面对Linux的驱动程序也不足,不少硬件厂商是在推出Windows版本的驱动程序后才编写Linux版的。但一些大硬件厂商在这方面做得还不错,他们的Linux版驱动程序一般都推出得比较及时。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)