天天看点

网易一面记录1. Linux的文件权限有几级,一个文件设置了777是否就可以删除了?2. 对Linux的fork的理解?3. 运行在线上的程序崩溃,怎么解决日志问题?4. onPause中做一些耗时操作,是否会延迟Activity的启动?

2021-09-10号网易一面。这几天连续几场笔试题,也就没多少时间进行面试整理,这里还是补一下。按照惯例,这里记录下自己理解比较模糊的问题。然后再解答这些问题。

文章目录

  • 1. Linux的文件权限有几级,一个文件设置了777是否就可以删除了?
  • 2. 对Linux的fork的理解?
  • 3. 运行在线上的程序崩溃,怎么解决日志问题?
  • 4. onPause中做一些耗时操作,是否会延迟Activity的启动?

1. Linux的文件权限有几级,一个文件设置了777是否就可以删除了?

为了进行测试,因为我之前租用了阿里的服务器,恰好是

linux

版本,这里就来进行简单的实验。远程连接工具为:putty。

使用

mkdir test

来创建一个新的文件夹,然后使用

ll

查看权限,如下图所示:

网易一面记录1. Linux的文件权限有几级,一个文件设置了777是否就可以删除了?2. 对Linux的fork的理解?3. 运行在线上的程序崩溃,怎么解决日志问题?4. onPause中做一些耗时操作,是否会延迟Activity的启动?

因为

Linux

系统是一种多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保护系统的安全性,

Linux

系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。

我们看上面的截图,对于第一位字符表示文件类型,常用的如下:

标识 解释
d 表示目录(directory)
- 表示文件
l 表示链接文件(link)
c 表示串行接口设备,比如鼠标、键盘等(即:一次性读取设备)

接下来的字符三个一组,一共三组。其中

r

表示可读,

w

表示可写,

x

表示可执行。注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号

-

而已。

网易一面记录1. Linux的文件权限有几级,一个文件设置了777是否就可以删除了?2. 对Linux的fork的理解?3. 运行在线上的程序崩溃,怎么解决日志问题?4. onPause中做一些耗时操作,是否会延迟Activity的启动?

以上权限解释内容来源:Runoob.com

那么,在回顾了文件权限后,继续看这个问题:一个文件设置了777是否就可以删除了?

比如切换到test目录,然后随便创建一个文件:

echo "做一些删除测试" >> file.md
           
网易一面记录1. Linux的文件权限有几级,一个文件设置了777是否就可以删除了?2. 对Linux的fork的理解?3. 运行在线上的程序崩溃,怎么解决日志问题?4. onPause中做一些耗时操作,是否会延迟Activity的启动?

然后,修改权限为777,即每个组的权限为最高:

chmod 777 file.md
           

此时的文件变为可读、可写、可执行:

网易一面记录1. Linux的文件权限有几级,一个文件设置了777是否就可以删除了?2. 对Linux的fork的理解?3. 运行在线上的程序崩溃,怎么解决日志问题?4. onPause中做一些耗时操作,是否会延迟Activity的启动?

那么,如果我们将上层的test的目录的权限修改为可读,

chmod 444 test
           
网易一面记录1. Linux的文件权限有几级,一个文件设置了777是否就可以删除了?2. 对Linux的fork的理解?3. 运行在线上的程序崩溃,怎么解决日志问题?4. onPause中做一些耗时操作,是否会延迟Activity的启动?

然后我们切换到

test

目录下,对创建的

file.md

文件进行删除,发现都可以删除???

当我使用

rm -rf file.md

的时候,没有阻碍。

可能是用户的原因,我这里是

root

用户登录,具有最高权限。

回到问题:一个文件设置了777是否就可以删除了?

是可以被删除的。

只有要删除整个目录,则需要目录的上一级目录(父目录)的

w

权限。如果没有

w

权限,则无法完成删除。

2. 对Linux的fork的理解?

fork

函数的功能就是创建一个新进程。

fork

函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。相当于克隆了一个自己。

C

语言中提供了

fork()

函数,调用后会返回一个值,返回一个大于

的值给父进程,返回

给子进程,返回负值说明

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

日志:

网易一面记录1. Linux的文件权限有几级,一个文件设置了777是否就可以删除了?2. 对Linux的fork的理解?3. 运行在线上的程序崩溃,怎么解决日志问题?4. onPause中做一些耗时操作,是否会延迟Activity的启动?

然后我们打开

/data/data/com.weizu.myapplication/files/a.log

日志文件,可以看见信息:

网易一面记录1. Linux的文件权限有几级,一个文件设置了777是否就可以删除了?2. 对Linux的fork的理解?3. 运行在线上的程序崩溃,怎么解决日志问题?4. onPause中做一些耗时操作,是否会延迟Activity的启动?

通过

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

  • Android中处理崩溃异常和记录日志
  • Runoob.com