闲话handle和handler

虽然handle和handler只有一个字符之差,但在程序员的世界里,含义却大相径庭。

1. 先说说handle

北京话说"一边儿玩儿去,玩勺子把儿去","勺子把儿"说的就是handle。二将handle翻译成"句柄"绝对是一个相当文雅相当阳春白雪的翻译,因为太文绉绉啦,很多文化底蕴不够的码农就看不大懂了或者望而生畏。为了弄明白为什么这么翻译,我费了点周折。 句柄者,弯杆杆儿,弯把手儿也。注意: "句"为"勾"的通假字,句柄应该读作gou柄才是。《说文解字》对"句"的解释是"句, 曲也"。《说文解字注》(作者:清代学者段玉裁,简称"段注")里是这么说的"凡曲折之物,侈为倨,敛为句。考工记多言倨句。" 因此,如果将handle翻译成大白话"玩把手儿",进不得教科书,页写不进那些晦涩乏味的计算机图书。那么,程序员如何理解handle呢?简单来说,handle就是一个"带把儿"的物件的那个"把儿"。

例如:

进程号pid就是一个handle,

文件描述符(fd)也是一个handle,

系统调用号(syscall num)仍然是一个handle,

... 不胜枚举。

在操作系统中,一切对用户来说是透明的但是操作系统内核看得懂的无符号整数(unsigned int)都可以被看作是handle。

在操作系统设计与实现中,联系内核态和用户态,靠的就是一个个无符号整数。因为用数字来做通信密码(比如:操作码,错误码等)实在是太方便了。而且,一个unsigned int占4个字节,可以表征的通信密码总数为2^32(=4G, 约40亿)。 如果不用无符号整数来做通信密码,而是采用可读性很好的明文(字符串"string")来做通信,那是何等的情何以堪?! 因为,计算机做字符串比较的代价要远远大于无符号整数的比较。

好啦,扯远了,一句话,下次看到"句柄",不用害怕啦。因为它就是handle, 说白了就是个跟一个黑盒子进行通信的密码。一旦通信密码传给了黑盒子,黑盒子怎么具体操作,对持有handle的用户来说,完全不用关心。"不看过程,只看结果"就得了。

2. 神马是handler

在编程中使用过信号(signal)的朋友一定跟handler不会陌生。 例如:

$ man -s2 signal
NAME
       signal - ANSI C signal handling

SYNOPSIS
       #include <signal.h>

       typedef void (*sighandler_t)(int);

       sighandler_t signal(int signum, sighandler_t handler);
...

hanlder就是一个回调函数(callback)。当某个事件到达时,事先注册的handler会被接收到事件的主体调用。 示例代码:

o foo.c

 1 #include <stdio.h>
 2 #include <signal.h>
 3 #include <unistd.h>
 4
 5 unsigned int g_exit = 0;
 6
 7 static void foo_handler()
 8 {
 9     printf("signal USR1 is caught, %s is called\n", __func__);
10     g_exit++;
11 }
12
13 int main(int argc, char *argv[])
14 {
15     signal(SIGUSR1, foo_handler);
16
17     while (!g_exit)
18         sleep(10);
19     printf("good bye\n");
20
21     return 0;
22 }

o 编译并测试

T1$ gcc -g -Wall -m32 -o foo foo.c

T1$ ./foo

T2$ ps -ef | grep foo | grep -v grep
veli      9239  2293  0 21:04 pts/7    00:00:00 ./foo

T2$ kill -SIGUSR1 9239

The output from T1 looks like:

T1$ ./foo
signal USR1 is caught, foo_handler is called
good bye
时间: 2024-10-14 07:58:34

闲话handle和handler的相关文章

ProgressBar与Handler的整合应用

在android中进度条使用ProgressBar表示,用于向用户显示某个耗时操作完成的百分比     之ProgressBar与Handler的整合应用 1.在xml文件中通过<ProgressBar>标记添加,表示基本如下: 1 <ProgressBar 2 android:id="@+id/progressBar1" style="?android:attr/progressBarStyleHorizontal" android:layout

安卓Handle的深入剖析和使用

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="font-size:14px;">在公司开发项目你不能说handle用的不多,反正这种更新主线程的机制是必须要懂的.面试的时候也总会叫你回答handle.looper.MessageQueen和Message的区别,所以你不仅仅只

Android多线程——Handler (一) 实现图片下载

在UI线程中创建子线程-->在子线程中获取网络图片-->在线程中通过Message 传递二进制图片给Handler,-->Handler在handleMessage()中处理消息 package com.example.android_handler_message; import java.io.IOException; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolEx

Android: ListView数据的分批加载 以及 Handle 总结

这是效果图: activity_main.xml 01 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 02     xmlns:tools="http://schemas.android.com/tools" 03     android:layout_width="match_parent" 04     android:layout_he

Android 基础总结:( 十五)Handler详解(下)

Android GWES之Android消息系统 Looper,Handler,View 我们要理解Android的消息系统,Looper,Handle,View等概念还是需要从消息系统的基本原理及其构造这个源头开始.从这个源头,我们才能很清楚的看到Android设计者设计消息系统之意图及其设计的技术路线. 1.消息系统的基本原理 从一般的系统设计来讲,一个消息循环系统的建立需要有以下几个要素: 消息队列 发送消息 消息读取 消息分发 消息循环线程 首先来研究一下消息驱动的基本模型,我使用如下的

Handle的使用

Handle 用于异步消息处理,发送消息后消息进入队列,然后发送消息函数即可返回,其他函数再逐个取出消息进行处理,也即接收消息与发送消息不是同步进行. 基本使用方法(异步消息处理机制) (1)创建一个Handle对象 (2)将要执行的操作写在线程对象(runnable)的run方法当中(用匿名内部类实现);在run方法内部,执行postDelayed或者post方法 (3)调用Handle的post方法,将要执行的线程对象添加到队列当中 (线程:实现Runnable接口的run方法) 例程: p

整理:3种消息传递机制的比较:Handler、BroadcastReceiver、EventBus

摘要:本文主要写了Handler.BroadcastReceiver.EventBus这三种消息传递机制的使用方法,这里强烈推荐使用最后一种,理由如下:1.完全解耦,发送者和接受者几乎没关联,删除其中一个对另外一个没影响(这一点Handler就不行).2.传参数方便,同时支持一个发送者发送多条消息.一个接受者接受多条消息. 1.Handler: (1).发送: public Handler parentHandler;//此Handle的赋值在目的地 // 发送Handle通知 Message

IT软件开发中常用的英语词汇

Aabstract 抽象的abstract base class (ABC)抽象基类abstract class 抽象类abstraction 抽象.抽象物.抽象性access 存取.访问access function 访问函数access level访问级别account 账户action 动作activate 激活active 活动的actual parameter 实参adapter 适配器add-in 插件address 地址address space 地址空间ADO(ActiveX D

JavaScript----marquee滚动标签 图片无缝滚动 插入百度地图

页面的自动滚动效果,可由javascript来实现, 但是有一个html标签 - <marquee></marquee>可以实现多种滚动效果,无需js控制. 使用marquee标记不仅可以移动文字,也可以移动图片,表格等. 语法:<marquee>...</marquee>: 说明:在标记之间添加要进行滚动的内容. 重要属性: 1.滚动方向direction(包括4个值:up. down. left和 right) 语法:<marquee direct