网易一面记录

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;
}

然后,我们在当前的MainActivityonCreate中注册一个方法用来处理没有被捕获到的异常,方法如下:

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,然后在清单文件中注册。
然后复写MainActivityonPause方法,并写一个死循环,如下:

@Override
protected void onPause() {
    
    
    super.onPause();
    while(true){
    
    
        try {
    
    
            Thread.sleep(200);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
    }
}

测试后发现,进入不了第二个Activity
所以,在onPause中做一些耗时操作,会延迟Activity的启动。


Thanks

猜你喜欢

转载自blog.csdn.net/qq_26460841/article/details/120235429