2021-09-10号网易一面。这几天连续几场笔试题,也就没多少时间进行面试整理,这里还是补一下。按照惯例,这里记录下自己理解比较模糊的问题。然后再解答这些问题。
文章目录
1. Linux的文件权限有几级,一个文件设置了777是否就可以删除了?
为了进行测试,因为我之前租用了阿里的服务器,恰好是linux
版本,这里就来进行简单的实验。远程连接工具为:putty。
使用mkdir test
来创建一个新的文件夹,然后使用ll
查看权限,如下图所示:
因为Linux
系统是一种多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保护系统的安全性,Linux
系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。
我们看上面的截图,对于第一位字符表示文件类型,常用的如下:
标识 | 解释 |
---|---|
d | 表示目录(directory) |
- | 表示文件 |
l | 表示链接文件(link) |
c | 表示串行接口设备,比如鼠标、键盘等(即:一次性读取设备) |
接下来的字符三个一组,一共三组。其中r
表示可读,w
表示可写,x
表示可执行。注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号 -
而已。
以上权限解释内容来源:Runoob.com
那么,在回顾了文件权限后,继续看这个问题:一个文件设置了777是否就可以删除了?
比如切换到test目录,然后随便创建一个文件:
echo "做一些删除测试" >> file.md
然后,修改权限为777,即每个组的权限为最高:
chmod 777 file.md
此时的文件变为可读、可写、可执行:
那么,如果我们将上层的test的目录的权限修改为可读,
chmod 444 test
然后我们切换到test
目录下,对创建的file.md
文件进行删除,发现都可以删除???
当我使用rm -rf file.md
的时候,没有阻碍。
可能是用户的原因,我这里是root
用户登录,具有最高权限。
回到问题:一个文件设置了777是否就可以删除了?
是可以被删除的。
只有要删除整个目录,则需要目录的上一级目录(父目录)的w
权限。如果没有w
权限,则无法完成删除。
2. 对Linux的fork的理解?
fork
函数的功能就是创建一个新进程。fork
函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。相当于克隆了一个自己。
C
语言中提供了fork()
函数,调用后会返回一个值,返回一个大于0
的值给父进程,返回0
给子进程,返回负值说明fork
失败了。
3. 运行在线上的程序崩溃,怎么解决日志问题?
首先线上程序崩溃大致可分为两种类别:
ANR
问题;- 程序异常退出;
对于ANR
问题,通常我们在本地测试的时候可以解决,但也存在可能,所以可以将本地的/data/data/anr/traces.txt
文件及时上传到服务器中。
对于程序异常退出,我觉得可以分为两类:
- 由于程序代码隐藏
BUG
触发的Exception
; - 由于内存泄露造成的应用内存不足,而导致的强制关闭;
对于第一类程序异常退出,我们需要及时上传本地捕获到的异常信息到自定义日志文件中,然后上报这个错误到服务器即可;
百度了一下,发现大家自定义这个Exception
的异常日志上报类的时候,使用的是UncaughtExceptionHandler
这个类。下面就参考Android中处理崩溃异常和记录日志来做一个实验:
比如页面有一个TextView
控件,并且在xml
文件中指定了回调函数为onTxtClick
。然后我们故意写一个BUG
,如下:
// TextView监听调用函数
public void onTxtClick(View v){
int a = 2 / 0;
}
然后,我们在当前的MainActivity
的onCreate
中注册一个方法用来处理没有被捕获到的异常,方法如下:
private void registerCrashHandler() {
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler(){
@Override
public void uncaughtException(@NonNull Thread t, @NonNull Throwable e) {
Log.e("TAG", "uncaughtException: ");
try {
FileOutputStream outputStream = openFileOutput("a.log", Context.MODE_APPEND);
StringBuilder info = new StringBuilder();
info.append(getTime()).append("\t").append(e.getLocalizedMessage().toString())
.append("\n");
outputStream.write(info.toString().getBytes());
outputStream.close();
} catch (IOException fileNotFoundException) {
fileNotFoundException.printStackTrace();
}
}
});
}
private String getTime(){
return new SimpleDateFormat("yyyy.MM.dd HH:mm:ss", Locale.getDefault()).format(new Date());
}
当我们点击了文本控件TextView
,那么程序理所当然的会报错,比如此时Logcat
日志:
然后我们打开/data/data/com.weizu.myapplication/files/a.log
日志文件,可以看见信息:
通过Thread.setDefaultUncaughtExceptionHandler
方法可以为当前线程设置一个未处理异常的处理器,具体需要什么逻辑,可以通过回调方法uncaughtException
来进行处理。
可以看出上面的异常属于Java层次的未处理异常。
对于第二类程序异常退出,需要记录当时的JVM
的堆栈信息,可以分析堆信息进行排查。
这个感觉不太可能做到,故而应该在开发中注意对内存的控制、及时释放无用空间,防止内存泄漏等问题。
4. onPause中做一些耗时操作,是否会延迟Activity的启动?
为了测试,新建一个TestActivity
,然后在清单文件中注册。
然后复写MainActivity
的onPause
方法,并写一个死循环,如下:
@Override
protected void onPause() {
super.onPause();
while(true){
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
测试后发现,进入不了第二个Activity
。
所以,在onPause
中做一些耗时操作,会延迟Activity
的启动。
Thanks