linux文件夹的权限太严格了
今天,把linu的usr和var文件夹的权限改为777,发现使用xshell不能连接虚拟机进行操作以及文件传输,并且虚拟机在启动是还报错,
Mounting HGFS shares: FAILEDStarting auditd:FAILED,
我先把usr以及var的权限给改回去了,改为755
然后,找了一堆资料:
Mounting HGFS filesystems: FAILED ,但不影响Ubuntu的使用。
#chown root.root /var/log/audit/audit.log
#chmod 600 /var/log/audit/audit.log
Android事件处理机制有两套:
基于监听的事件处理
基于回调的事件处理
先说一下事件处理的过程,事件处理主要涉及三个主要部分,事件源、事件、事件监听器,下面画个图解释一下他们之间的关系和事件处理的过程:
下面说说基于监听的事件处理
熟悉swing的都知道,这很简单,就是为事件源注册监听者,然后实现监听者接口就哦了
实现监听者有四种方法,下面分别说说四种方法的利弊:
一、外部类实现监听者
利:
基本没有
弊:
1、事件监听器通常属于特定的GUI界面,不利于程序的内聚性
2、外部类监听器不能随意访问GUI界面类中的组件,编程不够简洁
二、内部类实现监听者
利:
1、可以在当前类中复用该类
2、给类可以随意访问外部类中的组件
弊:
基本没有
三、匿名内部类实现监听者
利:
大部分时候事件处理器没有复用价值,匿名内部类正好
弊:
语法有点难度
四、Activity本身作为监听者
利:
基本没有
弊:
1、Activity本身应只负责界面类的初始化,不要多管闲事,违反单一功能原则
2、看着就乱
再说说基于回调的事件处理
实现方法:要通过自定义View来实现,在自定义View中重写该View的事件处理方法即可
例如:自定义MyButton继承自Button,覆盖onKeyDown方法,然后使用MyButton时发生keyDown事件就会调用此方法
好处:可以使内聚性更强
另外,Android中还可以在xml文件中以标签的形式绑定组件相应的事件处理函数
例如:
一个按钮<Button android:onClick="clickEvent".../>
在相应的Activity中定义clickEvent函数即可
好处:方便简洁
最近刚看unix环境高级编程这本书,对于缓冲的概念总是比较模糊,当看到这段程序程序的时候,就细细的琢磨了一番,终于对于缓冲的概念有了一个新的认识,并且也加深了对于fork()的理解。
首先看下这段程序173.c
#include "apue.h" int glob=6; char buf[]="a write to stdout\n"; int main(void) { int var; pid_t pid; var=88; if(write(STDOUT_FILENO,buf,sizeof(buf)-1)!=sizeof(buf)-1) err_sys("write error"); printf("before fork \n"); if((pid=fork())<0) err_sys("fork error"); else if(pid==0) { glob++; var++; } else sleep(2); printf("pid= %d,glod=%d, var=%d \n",getpid(),glob,var); exit(0); }
学过linux就应该知道,fork()之后,是父进程先执行还是子进程先执行取决于内核的调度算法,所以在这为了先让子进程执行,我们让父进程睡眠2秒,虽然这不一定保证能达到子进程先执行的目的。但是我在ubuntu12.04验证过了,这是可以保证的。
当我们用命令cc 173.c编译后再用命令./a.out执行的时候,输出如下:
a write to stdout
before fork
pid= 3196,glod=7, var=89
pid= 3195,glod=6, var=88
由于write函数是不带缓冲的,因为在fork()之前调用的write,所以其数据写到标准输出一次。
但是标准I/O库是带缓冲的,当我们用以上这种方式运行的时候,before fork只会输出一次,其原因是我们是用的交互式方式运行的该程序,且标准输出连到终端设备,它是行缓冲,标准缓冲区由换行符冲洗掉了,所以只得到printf一次。
接下来我们用第二种方式运行该程序,执行命令./a.out > temp.out,然后cat temp.out,得到结果如下:
a write to stdout
before fork
pid= 3205,glod=7, var=89
before fork
pid= 3204,glod=6, var=88
我们得到两次before fork,这是因为我们把标准输出重定向到了temp.out,它是全缓冲的,那么该行数据不会被换行符冲洗掉,然后在将父进程的数据空间复制到子进程中时,该缓冲区也被复制到了子进程中。于是父子进程都拥有该行内容的标准I/O缓冲区。
为了验证这一点,我改写了一下程序,如下:
#include "apue.h" int glob=6; char buf[]="a write to stdout\n"; int main(void) { int var; pid_t pid; var=88; if(write(STDOUT_FILENO,buf,sizeof(buf)-1)!=sizeof(buf)-1) err_sys("write error"); printf("before fork %d\n",getpid()); if((pid=fork())<0) err_sys("fork error"); else if(pid==0) { glob++; var++; } else sleep(2); printf("pid= %d,glod=%d, var=%d \n",getpid(),glob,var); exit(0); }
重新编译后输出如下:
a write to stdout
before fork 3204
pid= 3205,glod=7, var=89
before fork 3204
pid= 3204,glod=6, var=88
两次输出的都是before fork 3204,而3204是父进程的pid.所以子进程是把父进程的标准I/O缓冲区里的内容复制了。