- 博客(64)
- 收藏
- 关注
翻译 17个最好用的iPhone数据恢复工具【2019更新】
我们在日常使用iPhone手机的时候,如果遇到意外删除,OS 13更新,恢复出厂设置,越狱等情况,会丢失宝贵的照片,视频,联系人,短消息等数据,如果你已备份数据使用iTunes或iCloud,可以从备份中恢复这些数据。但是如果没有可用的备份怎么办呢?如何在没有备份的情况下从iPhone恢复数据?幸运的是,还有另一种恢复iPhone数据的方法 - 使用第三方iPhone数据恢复工具。如果您通过搜索...
2019-08-05 17:21:03
13895
2
原创 如何在iPhone和iPad上恢复已删除的联系人
你是否曾通过单击错误按钮从iPhone中删除重要联系人,或者在更新到iOS 13测试版或出厂重置后,您的iPhone联系人消失了,丢失iPhone或iPad上的联系人可能非常烦人,尤其是当你需要紧急联系某人时。幸运的是,你的联系人并没有永远消失。有一些方法可以尝试让他们回来。您可以在iCloud设置中恢复联系人,也可以从iTunes备份中检索联系人。如果这两种方法都不起作用,请不要担心,您可以...
2019-07-18 14:48:50
1132
原创 Linux http网络协议
N年前,去一家比较大型的公司面试,被面试官问到http返回的状态行里的数字404是什么意思,500是什么意思,403是什么意思,503是什么意思,我当时只知道200是正常返回,一时被问懵了。。。还有一次面试,被问到http头信息里都包含哪些东西,我当时就在想,丫的平时直接调用接口,用http请求,然后返回数据不就行了,问的这些又用不上,有什么意义,现在回想起来,可能是面试官想考察下是否真的理解了ht
2016-12-05 15:31:26
513
原创 Linux Socket编程
前面我们总结了Linux网络编程基础,今天会用到大部分前一篇所讲的内容,我们知道Socket是可以利用TCP或者UDP协议进行通信的,下面来分别看下两个流程图: 1 基于TCP协议的流程图: 2 基于UDP协议的流程图: 下面我就用例子来分别演练 在进行演练之前,我们先把一些需要用到的结构体或者变量列出来:struct sockaddr_un { sa_family_t sun_famil
2016-12-02 18:02:06
446
原创 Linux 网络编程基础
大家在面试的时候,经常会被问到TCP,UDP的一些东西,我们平时在工作中,直接用封装好的网络请求,很少关注这些,今天我就来总结下这些基本的知识,在早期的时候有一个OSI网络模型 其实后来的各种协议,并没有完全使用这七层结构,比如我们熟知的TCP/IP,是四层网络模型 我们常用的网络传输Socket,就是应用了这些协议进行通信,这个我们后面说。 TCP UDP属于传输层,他们的区别如下:
2016-12-01 16:08:06
380
原创 Linux 线程管理
相信大家用java语言写线程已经很熟悉了,今天我们就来看下,在Linux下开发的时候怎么进行线程的管理 1 pthread_create函数 创建一个线程 函数原型:int pthread_create((pthread_t thread, pthread_attr_t *attr, void (start_routine)(void ), void *arg) 第一个参数
2016-11-30 16:11:34
1408
原创 Linux 进程间通信之信号量
信号量是解决因多个程序同时访问一个共享资源而引发的一系列问题的,信号量是0代表其他程序要暂时挂起,不能访问信号量控制的代码区,信号量为1,代表其他程序可以访问信号量控制的代码区,这个信号量也是在内核区的共享内存存放的,我们来看几个关键函数: 1 semget函数 它的作用是创建一个新信号量或取得一个已有信号量,原型为: int semget(key_t key, int num_sems, i
2016-11-30 14:52:16
270
原创 Linux 进程间通信之消息队列
说到消息队列,大家一定能想到android中的消息队列,有一个Looper不断的去消息队列中取消息的模型,Linux进程间通信的消息队列是在内存中建立一个消息队列(其实是一个链表),两个进程就可以通过发消息和收消息达到通信的目的 我们可以通过ipcs -q来查看当前系统中的消息队列 我们发现目前还没有消息队列1 msgget函数 该函数用来创建和访问一个消息队列。它的原型为:int msgge
2016-11-29 15:28:01
349
原创 Linux 进程间通信之共享内存
我们在前面的进程管理文章中描述过进程的虚拟内存模型 那么我们在共享内存的时候其实是两个步骤,首先需要在内存中开辟一段空间作为共享内存,然后需要把内存中的共享内存映射到每个进程的虚拟内存中,完成通信 首先可以通过ipcs -m来查看当前系统中有没有共享内存 我们发现,目前还没有1 shmget函数 该函数用来创建共享内存,它的原型为:int shmget(key_t key, size
2016-11-29 14:44:46
293
原创 Linux 进程间通信之信号
一 信号(signal) 在说信号之前,先来谈谈硬中断和软中断,硬中断就是我们的硬件模拟的中断,比如我们敲击键盘,Linux本来在运行或者休眠,这个时候发出一个中断,来响应我们的事件,软中断就是从程序上模拟的中断,我们可与在程序中给系统发送一个信号,来响应中断,可以用kill -l来查看系统支持哪些中断 我们只查几个看看什么意思 SIGINT 程序终止(interrupt)信号, 在用户
2016-11-29 11:14:04
311
原创 Linux 进程间通信之pipe和FIFO
在上一篇文章中我们说了,每个进程有自己的虚拟内存,互不想通,那如果想完成进程间通信,就需要借助一些机制,在Linux中不管是什么方式的进程间通信,最终操作的都是内存,今天就总结下Linux进程间通信的pipe和FIFO方式,pipe是无名管道,只能是父子进程或兄弟进程可以通信,FIFO是有名管道,没有了pipe的限制,可以在不同进程间通信,两者的区别就在于此,基本原理差不多,如下图: 1 pipe
2016-11-28 15:30:40
676
原创 Linux 进程管理
在开始今天的分享以前,我想先说点什么,如果是一直在看我博客的朋友应该会发现,我在刚开始写博客的时候,分享了一些android上层的东西,也是因为我做了很多年的android上层,对它比较熟悉,所以写的内容也比较(自认为全面或深度还可以),但是我长期规划的目标是往底层走,所以我最近一段时间开始分享Linux的一些文章,前期是Linux基本操作,然后是Linux应用开发,最后我还打算研究Linux底层内
2016-11-28 11:42:20
424
原创 Linux chmod opendir readdir closedir
我们在用shell敲命令的时候有一个chmod,大家都很熟悉了,其实chmod还是一个函数,我们可以在程序中给文件权限: 我们先创建一个hello文件,看一下权限 然后看代码 执行,再看hello的权限 下面我们来看下opendir,readdir closediropendir 函数原型 DIR* opendir (const char * path ); (获取path子目录下的
2016-11-26 11:04:35
344
原创 Linux fcntl函数 建议锁 强制锁
在多个进程访问同一个文件的时候,我们肯定不希望在一个进程写入或修改文件时,另外一个进程也可以修改文件内容,这样就乱了,Linux在底层通过加锁的方式来避免这种文件,我们可以通过fcntl函数来给文件上锁,锁又分为建议锁和强制锁,建议锁,顾名思义,相对温柔一些,在对文件进行锁操作时,会检测是否已经有锁存在,并且尊重已有的锁,但是另外的进程还可以修改文件。在一般的情况下,内核和系统都不使用建议锁。强制性
2016-11-26 10:33:12
1757
原创 Linux 标准IO操作函数fopen fclose fread fwrite fgetc fputc fgets fputs
昨天我分享了Linux文件系统调用的一些函数,是不带缓存的,一般是底层调用,今天来分享下上层的标准IO操作函数,也就是跨平台的,一般以f开头 1 fopen 函数原型 FILE * fopen(const char *path,cost char *mode)作用:打开一个文件,返回指向该文件的指针参数说明:第一个参数为欲打开文件的文件路径及文件名,第二个参数表示对文件的打开方式注:mod
2016-11-25 14:35:04
1002
原创 Linux 文件系统调用函数open close read write lseek perror
Linux系统中操作文件有两种方式,一种是标准C的文件执行函数,一般以f开头,fopen,fread,fwrite等等,这种操作执行是带缓存的,一般系统会对它进行优化,另外一种是系统调用,open, close, read, write, lseek,也就是我们今天要分享的,这种不带缓存,直接读和写都是真实的数据,一般在驱动中需要用到这种方式,今天先来分享系统调用的几个函数,明天再分享标准C的文件操
2016-11-24 11:07:52
2292
原创 Linux eclipse安装及使用
我们在搞上层开发的时候,都是在windows下使用eclipse,那么如果是Linux应用开发,就必须要在Linux中安装eclipse,用于C/C++开发,当前是要在Linux带界面的系统中运行了,我这里就重新安装了一个带界面的CentOS6.3 首先打开浏览器,找到jdk的官网,下载Linux下的jdk8的gz包 这个下载过程我就不演示了,然后打开eclipse的官网,下载eclipse C
2016-11-23 19:58:10
1143
原创 Linux AutoTools工具
我们前面分析了Makefile的编写,其实一个大的项目,如果手工去写Makefile的话会比较累,那么我们可以用AutoTools的一系列工具来生成Makefile 大家在Linux中下载的任何源码包都需要先执行configure的配置文件,这个就是用来生成Makefile的 AutoTools其实是一系列工具,包含aclocal、autoscan、autoconf、autoheader、和au
2016-11-23 17:31:05
683
原创 Linux Makefile编写
我之前总结了gcc的用法,那么在实际工作中,每次用gcc会很麻烦,尤其是一些大型项目,有很多的目录结构,这个时候我们就需要编写Makefile文件,然后在实际工作中,用make来编译大型的项目,相信搞过android开发的一定对make,make install,make clean不陌生,分别是编译,安装和清理,下面我就用一个例子来说明Makefile怎么编写,还是上一讲的三个文件 func1.
2016-11-23 16:59:18
470
原创 Linux gdb调试
今天来分享下gdb的简单调试,我这里写了个例子 三个.c文件 func1.c func2.c main.c 首先生成可调试的执行文件 gcc -g func1.c func2.c main.c -o main 然后gdb main,进入调试模式 list列出源代码,可以用开头字母l,按回车往下翻 break 行号可以打断点 可用开头字母b 行号 break 函数名也可以打断
2016-11-22 14:31:22
347
原创 Linux备份与恢复
一 备份概述 1 Linux系统需要备份的数据 安装服务的数据 2 备份策略 完全备份:把所有需要备份的数据全部备份,这样比较慢,恢复起来也比较慢 增量备份: 就是每天只备份新增的部分,这样备份最快,缺点是恢复的时候比较麻烦,需要一步一步往回恢复 差异备份 这种效率介于上面两者之间二 dump和restore命令 1 dump命令 dump 选项 备份之后的文件名
2016-11-21 14:31:41
267
原创 Linux启动管理
一 系统运行级别 如果想查看运行级别,用runlevel init 运行级别 就可以改变系统运行级别系统默认级别,也就是开机进入哪个级别,在/etc/inittab中 二 启动过程 首先是BIOS加载MBR,MBR里有个扇区,里面有启动引导程序,如果是单系统,直接加载内核,如果是多系统,调用其他分区的启动引导程序,然后加载内核,内核解压并自检,这个时候需要加载驱动,但是由于还没有加载
2016-11-21 13:43:56
260
原创 Linux日志管理
一 日志服务简介 在linux系统中,日志服务是由rsyslogd服务提供的,我们先来查看这个日志服务是否启动和自启动 我们可以看到这个服务是默认开机自启动的 下面我们来看下常见的日志文件的作用 除了系统默认日志外,采用RPM包方式安装的系统服务也会默认把日志记录在/var/log/目录中,(源码包安装的服务日志在源码包指定的目录中),不过这些日志不是由rsyslogd服务来记录和管理的
2016-11-21 09:59:28
312
原创 Linux系统管理
一 进程管理 进程是一个正在执行的程序或命令,每一个进程都是一个运行的实体,都有自己的地址空间,并占有一定的内存 查看系统中的所有进程 ps aux 查看系统中的所有进程,使用BSD操作系统格式 ps -le 查看系统中的所有进程,使用Linux标准命令格式USER:该进程是由哪个用户产生的 PID:进程的ID号 %CPU:该进程占有CPU资源的百分比,占用越高,该进程越耗费资源
2016-11-19 11:13:09
367
原创 Linux服务管理
一 服务的分类与简介 1 服务的分类 Linux服务包含RPM包默认的安装服务和源码包安装的服务,RPM包默认安装的服务又分为独立的服务和基于xinetd服务,独立的服务相当于直接在内存中,只要用到这个服务,就会有响应,基于xinetd的服务不在内存中,需要xinetd去调起相应的服务,但是xinetd服务是独立的服务2 启动与自启动 服务启动:就是在当前系统中让服务运行,并提供服务 服
2016-11-18 10:15:20
322
原创 设计模式-策略模式
在软件开发中,我们经常遇到针对不同情况使用不同的算法或者逻辑,然后用if/else来控制起来,我们来看个例子,比如说国足要征战世界杯亚洲区12强赛,那么针对不同对手,需要有不同的打法和战术public void test(String duishou){ if(duishou.equals("韩国")){ System.out.println("执行防守反击战
2016-11-17 17:22:20
231
原创 设计模式-责任链模式
说到责任链模式,几年前有一次面试经历,面试官拿着两页程序来考我设计模式,其实就是责任链模式,今天就来总结下这个模式 其实责任链模式的好处就是让我们省略了很多if/else或者switch语句,多个对象都有机会处理,从而避免了请求的发送者和接受者之间的耦合,形成一个链,沿着这个链传递,知道有一个对象处理为止。 角色: 1 抽象处理者(Handler)角色,定义一个处理请求的接口,定义两个方法,分
2016-11-17 15:43:43
330
原创 设计模式-观察者模式
观察者模式中主要有4中角色: 1 抽象主题(Subject)角色:抽象主题角色把所有对观察者对象的引用保存在一个聚集(比如ArrayList对象)中,每个主题都可以有任意数量的观察者,抽象主题里提供接口,增加和删除观察者,通知观察者。 2 具体主题(ConcreteSubject)角色:将有关状态,存入具体的观察者对象,当自己状态发生改变时,通知所有的观察者 3 抽象观察者(Observer)
2016-11-16 16:10:13
236
原创 Linux Shell编程-流程控制
一 if语句 1 单分支if语句 if [ 条件判断式 ];then 程序 fi 或者 if [ 条件判断式 ] then 程序 fi 注意点: if语句使用fi结尾,跟一般语言使用大括号结尾不同 中括号和条件判断式直接必须有空格 then后面跟符合条件之后执行的程序,可以放在[]之后用;分隔,也可以换行写入,就不需要;了例子:判断分区使用率
2016-11-16 10:48:15
369
原创 Linux Shell编程-条件判断
1 按照文件类型进行判断 -b 文件:判断该文件是否存在,并且是否为块设备文件(是块设备文件为真) -c 文件:判断该文件是否存在,并且是否为字符设备文件(是字符设备文件为真) -d 文件:判断该文件是否存在,并且是否为目录文件(是目录文件为真) -e 文件:判断该文件是否为真(存在为真) -f 文件:判断该文件是否存在,并且是否为普通文件(是普通文件为真) -L 文件:判断该文件是否存
2016-11-15 14:48:57
338
原创 Linux Shell编程-字符截取和处理命令
一 cut命令 cut 选项 文件名 -f 列号,列号 :提取第几列,多个列用,分隔 -d 分隔符:按照指定分隔符分隔列比如有一个文件student.txt 注意,每个列直接用的TAB键 cut -f 2,3 student.txt 截取第2列和第3列cut -d “:”-f 1,3 /etc/passwd cut命令的局限 如果想以” “空格来分割,截图第3列,是截
2016-11-14 15:31:45
853
原创 Linux Shell编程-正则表达式
一 正则表达式与通配符 1 正则表达式是用在文件中匹配符合条件的字符串,正则是包含匹配,grep,awk,sed等命令可以支持正则表达式 2 通配符是用来匹配符合条件的文件名,通配符是完全匹配,ls,find,cp这些命令不支持正则表达式,所以只能用Shell自己的通配符来进行匹配了。 二 基础正则表达式 这里引用兄弟连的测试文本 1 * 前一个字符匹配0次或任意多次 grep “a
2016-11-14 14:52:32
1102
原创 Linux Shell基础-环境变量配置文件
一 简介 环境变量配置文件中,主要是定义对系统的操作环境生效的系统默认环境变量,比如PATH,HISTSIZE,PS1,HOSTNAME等默认环境变量 主要是下面这个5种 我们之前设置的一些变量,都是临时生效,如果想要让变量重启后还生效,就需要写入这些配置文件中,写完之后,如果不想重启,立即生效用source 配置文件或者. 配置文件,说到这里,让我想起了编译android系统时的一个配置
2016-11-14 10:40:14
1098
1
原创 设计模式-单例模式
相信大家去面试的时候,经常被问到单例模式的有关问题吧,今天我们就来好好总结一下 一 懒汉式public class Singleton { private static Singleton instance = null; private Singleton() {} public static Singleton getInstance() {
2016-11-11 17:28:05
225
原创 Linux Shell基础-Bash变量
一 用户自定义变量 1 变量定义 name=”shen chao” 注意 变量名不能以数字开头,可以不加双引号,但如果有空格,就必须加双引号或单引号 2变量叠加 如果需要增加变量的值,那么可以进行变量值的叠加,形式可以是 3 查看变量set 4 删除变量unset 变量名 比如unset aa二 环境变量 1 环境变量是什么 用户自定义变量只能在当前Shell中生
2016-11-11 14:17:29
531
原创 Linux Shell基础-脚本执行方式和Bash基本功能
一 概述 1 Shell是一个命令行解释器,它为用户提供了一个向内核发送请求以便运行程序的界面系统级程序 Shell还是一个功能强大的编程语言,易编写,易调试,灵活性较强,Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令2 Shell的分类 Bourne Shell:从1979年起Unix就开始使用Bourne Shell,Bourne Shell的主文件名为s
2016-11-10 10:39:49
947
原创 Linux下gcc编译过程,静态链接库和动态链接库
一 gcc编译过程 我们知道gcc是一个强大的编译器,很多Linux下的GNU工具都是用C语言写的,并且用gcc编译的,那么gcc的编译过程是怎样的呢,先来看一个总的流程图,我自己简单画的,凑合着看 1首先是源文件经过预加载变成了.i结尾的文件,可以通过-E这个参数来生成这个中间文件,这里主要是把一些include的头文件和一些宏定义,放到源文件中。 2从预加载的文件经过编译就会变成汇编语
2016-11-08 17:39:04
1261
原创 Linux文件系统管理
一 分区 1 分区类型 主分区:总共最多只能分4个 扩展分区:只能有1个,也算主分区的一种,也就是说主分区+扩展分区最多只能有4个,但是扩展分区不能存储数据和格式化,必须再划分为逻辑分区才可用 逻辑分区:逻辑分区是在扩展分区中划分的,如果是IDE硬盘,Linux最多支持59个逻辑分区,如果是SCSI硬盘,Linux最多支持11个逻辑分区2 分区表示方法 也就是说逻辑分区只能
2016-11-07 17:28:13
967
原创 Linux权限管理ACL权限,文件特殊权限,chattr权限,sudo权限
一 ACL权限 ,我们来假设这么一种场景,在真实项目中有一个目录project,它的所属主的权限是rwx,它的所属组的权限也是rwx,其他人没有任何权限,我们的员工一般都会划分到所属组里,来完成日常工作,但是这个时候来了一个新员工,这个员工对linux操作不太熟悉,管理员只想给它分配读和执行的权限,不想给它写的权限,防止他误删文件或是其他,我们该怎么办呢,新建一个组?文件夹只能有一个所属组,把其他
2016-11-07 11:42:33
463
原创 Linux用户和用户组管理
一 用户配置文件 1 用户信息文件 /etc/passwd 我们先打开这个文件看一下 这里涉及到一些格式,我们还记得用man可以查看配置信息的帮助 man 5 passwd 这里看到:分割的每一项都有做详细说明,我们来总结下这里 第1个字段:用户名称第2个字段:密码标志,我们可以看到都是x,那么真实的密码在哪里呢,我们来看/etc/shadow文件 这里我们看到root对应
2016-11-02 15:59:06
679
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人