深入理解Linux内核task_struct结构(下)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 深入理解Linux内核task_struct结构(下)

这里对这几个文件做一点说明:

  1. busybox 作为linuxrc启动后, 会读取/etc/profile, 这里面设置了一些环境变量和shell的属性
  2. 根据/etc/fstab提供的挂载信息, 进行文件系统的挂载
  3. busybox 会从 /etc/inittab中读取sysinit并执行, 这里sysinit指向了/etc/init.d/rcS
  4. /etc/init.d/rcS 中 ,mdev -s 这条命令很重要, 它会扫描/sys目录,查找字符设备和块设备,并在/dev下mknod

dev目录:

# bryant @ ubuntu in ~/Downloads/busybox-1.33.1/_install/dev [1:17:36]
$ sudo mknod console c 5 1

这一步很重要, 没有console这个文件, 用户态的输出没法打印到串口上

lib目录:拷贝lib库,支持动态编译的应用程序运行

# bryant @ ubuntu in ~/Downloads/busybox-1.33.1/_install/lib [1:18:43]
$ cp /usr/aarch64-linux-gnu/lib/*.so*  -a .

编译内核

配置内核

linux内核源码可以在github上直接下载。

根据arch/arm64/configs/defconfig 文件生成.config

make defconfig ARCH=arm64

将下面的配置加入.config文件中

CONFIG_DEBUG_INFO=y 
CONFIG_INITRAMFS_SOURCE="./root"
CONFIG_INITRAMFS_ROOT_UID=0
CONFIG_INITRAMFS_ROOT_GID=0

CONFIG_DEBUG_INFO是为了方便调试

CONFIG_INITRAMFS_SOURCE是指定kernel ramdisk的位置,这样指定之后ramdisk会直接被编译到kernel 镜像中。

我们将之前制作好的根文件系统cp到root目录下:

# bryant @ ubuntu in ~/Downloads/linux-arm64 on git:main x [1:26:56]
$ cp -r ../busybox-1.33.1/_install root

执行编译

make ARCH=arm64 Image -j8  CROSS_COMPILE=aarch64-linux-gnu-

这里指定target为Image 会只编译kernel, 不会编译modules, 这样会增加编译速度

启动qemu

下载qemu

需要注意的,qemu最好源码编译, 用apt-get直接安装的qemu可能版本过低,导致无法启动arm64内核。笔者是使用4.2.1版本的qemu

apt-get install build-essential zlib1g-dev pkg-config libglib2.0-dev binutils-dev libboost-all-dev autoconf libtool libssl-dev libpixman-1-dev libpython-dev python-pip python-capstone virtualenv
wget https://download.qemu.org/qemu-4.2.1.tar.xz
tar xvJf qemu-4.2.1.tar.xz
cd qemu-4.2.1
./configure --target-list=x86_64-softmmu,x86_64-linux-user,arm-softmmu,arm-linux-user,aarch64-softmmu,aarch64-linux-user --enable-kvm
make 
sudo make install

编译完成之后,qemu在 /usr/local/bin目录下

$ /usr/local/bin/qemu-system-aarch64 --version
QEMU emulator version 4.2.1
Copyright (c) 2003-2019 Fabrice Bellard and the QEMU Project developers

启动linux内核

/usr/local/bin/qemu-system-aarch64 -m 512M -smp 4 -cpu cortex-a57 -machine virt -kernel

这里对于参数做一些解释:

  • -m 512M 内存为512M
  • -smp 4 4核
  • -cpu cortex-a57cpu 为cortex-a57
  • -kernel kernel镜像文件
  • -append传给kernel 的cmdline参数。其中rdinit指定了init进程;nokaslr 禁止内核起始地址随机化,这个很重要, 否则GDB调试可能有问题;console=ttyAMA0指定了串口,没有这一步就看不到linux的输出;
  • -nographic禁止图形输出
  • -s监听gdb端口, gdb程序可以通过1234这个端口连上来。

这里说明一下console=ttyAMA0是怎么生效的。

查看linux源码可知ttyAMA0对应的是AMBA_PL011这个驱动:

config SERIAL_AMBA_PL011_CONSOLE
    bool "Support for console on AMBA serial port"
    depends on SERIAL_AMBA_PL011=y
    select SERIAL_CORE_CONSOLE
    select SERIAL_EARLYCON
    help
      Say Y here if you wish to use an AMBA PrimeCell UART as the system
      console (the system console is the device which receives all kernel
      messages and warnings and which allows logins in single user mode).
      Even if you say Y here, the currently visible framebuffer console
      (/dev/tty0) will still be used as the system console by default, but
      you can alter that using a kernel command line option such as
      "console=ttyAMA0". (Try "man bootparam" or see the documentation of
      your boot loader (lilo or loadlin) about how to pass options to the
      kernel at boot time.)

AMBA_PL011是arm的一个标准串口设备, qemu 的输出就是模拟的这个串口。

在qemu的源码文件中,也可以看到PL011的相关文件:

# bryant @ ubuntu in ~/Downloads/qemu-4.2.1 [1:46:54]
$ find . -name "*pl011*"
./hw/char/pl011.c

成功启动Linux后, 串口打印如下:

[    3.401567] usbcore: registered new interface driver usbhid
[    3.404445] usbhid: USB HID core driver
[    3.425030] NET: Registered protocol family 17
[    3.429743] 9pnet: Installing 9P2000 support
[    3.435439] Key type dns_resolver registered
[    3.440299] registered taskstats version 1
[    3.443685] Loading compiled-in X.509 certificates
[    3.461041] input: gpio-keys as /devices/platform/gpio-keys/input/input0
[    3.473163] ALSA device list:
[    3.474432]   No soundcards found.
[    3.485283] uart-pl011 9000000.pl011: no DMA platform data
[    3.541376] Freeing unused kernel memory: 10752K
[    3.545897] Run /linuxrc as init process
[    3.548390]   with arguments:
[    3.550279]     /linuxrc
[    3.551073]     nokaslr
[    3.552216]   with environment:
[    3.554396]     HOME=/
[    3.555898]     TERM=linux
[    3.985835] 9pnet_virtio: no channels available for device kmod_mount
mount: mounting kmod_mount on /mnt failed: No such file or directory
/etc/init.d/rcS: line 8: can't create /proc/sys/kernel/hotplug: nonexistent directory
Please press Enter to activate this console.
[root@bryant ]#
[root@bryant ]#

VSCode+GDB

vscode中集成了GDB功能,我们可以用它来图形化的调试linux kernel

首先我们添加vscode的gdb配置文件(.vscode/launch.json):

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "kernel debug",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/vmlinux",
            "cwd": "${workspaceFolder}",
            "MIMode": "gdb",
            "miDebuggerPath":"/usr/bin/gdb-multiarch",
            "miDebuggerServerAddress": "localhost:1234"
        }
    ]
}

这里对几个重点参数做一些说明:

  • program: 调试的符号文件
  • miDebuggerPath:gdb的路径, 这里需要注意的是,由于我们是arm64内核,因此需要用gdb-multiarch来进行调试
  • miDebuggerServerAddress:对端地址,qemu会默认使用1234这个端口

配置完成之后,可以直接启动GDB, 连接上linux kernel

在vscode中,可以设置断点,进行单步调试

六、Apache HTTP Server

Apache HTTP Server,通常称为 Apache Web Server,是世界上最流行的 Web 服务器软件之一,由 Apache 软件基金会开发和维护。它是一个跨平台的、开源的 HTTP 服务器,可以在多种操作系统上运行(如 Linux、Unix、Windows 等),并支持多种编程语言(如 PHP、Python 等)。

Apache HTTP Server 的主要特点包括:

  1. 多模块化:提供了很多扩展模块,可以通过加载不同的模块来实现不同的功能。
  2. 高度可配置:具有灵活性和可扩展性,允许用户根据自己的需求进行定制。
  3. 安全性高:提供了各种安全机制来保护服务器和客户端数据的安全性。
  4. 可靠稳定:已经成熟,并且被广泛应用于互联网中,在负载量较大时仍能保持稳定性。
  5. 性能优越:采用事件驱动和异步 I/O 模型等技术,以及缓存机制等方法来提高处理效率和响应速度。

6.1安装Apache软件

1. 下载软件包

[root@centos6 ~]# wget http://mirror.bit.edu.cn/apache/httpd/httpd-2.4.4.tar.gz 
[root@centos6 ~]# wget http://mirror.bjtu.edu.cn/apache/apr/apr-1.4.6.tar.gz 
[root@centos6 ~]# wget http://mirror.bjtu.edu.cn/apache/apr/apr-util-1.5.2.tar.gz

2. 安装软件

[root@centos6 ~]# yum –y install gcc autoconf automake make \ 
> pcre pcre-devel openssl openssl-devel 
[root@centos6 ~]# tar –xzf httpd-2.4.4.tar.gz –C /usr/src/ 
[root@centos6 ~]# tar –xzf apr-1.4.6.tar.gz –C /usr/src/ 
[root@centos6 ~]# tar –xzf apr-util-1.5.2.tar.gz –C /usr/src/ 
[root@centos6 ~]# cd /usr/src/apr-1.4.6/ 
[root@centos6 apr-1.4.6]# ./configure  --with-apr=/usr/local/apr/ 
[root@centos6 apr-1.4.6]# make && make install 
[root@centos6 apr-1.4.6]# cd /usr/src/apr-util-1.5.2/ 
[root@centos6 apr-util-1.5.2]# ./configure  --with-apr=/usr/local/apr/ 
[root@centos6 apr-util-1.5.2]# make && make install 
[root@centos6 apr-util-1.5.2]# cd /usr/src/httpd-2.4.4/ 
[root@centos6 httpd-2.4.4]# ./configure –prefix=/usr/local/apache2 –enable-so \ 
> --enable-ssl  --enable-rewrite –with-mpm=worker –with-suexec-bin \ 
> --with-apr=/usr/local/apr/ 
[root@centos6 httpd-2.4.4]# make && make install

configure脚本用来检查系统环境、查找依赖文件、设置安装路径等操作,configure拥有很多参数,读者可以通过./configure --help查看该脚本支持的所有参数。

下面是configure常用参数说明:

参数            描述
--prefix            指定Apache httpd程序的安装主目录
--enable-so         开启模块化功能,支持DSO(动态共享对象)
--enable-ssl        支持SSL加密
--enable-rewrite    支持地址重写
--with-mpm          设置Apache httpd工作模式
--with-suexec-bin   支持SUID、SGID
--with-apr          指定apr程序绝对路径

3. 启动服务

[root@centos6 ~]# /usr/local/apache2/bin/apachectl start 
[root@centos6 ~]# netstat -ntulp |grep http 
[root@centos6 ~]# iptables -I INPUT -p tcp -dport 80 -j ACCEPT

安装完成后Apache会提供名为apachectl启动脚本,该脚本提供了Apache httpd的启动、关闭以及测试功能,没有修改配置文件的情况下使用start启动httpd程序,可能会返回错误提示:”Could not reliably determine the server’s fully qualified domain name”,提示说明httpd无法确定服务器域名称,可以修改主配置文件的ServerName项来解决。该提示也可以忽略,通过netstat命令查看httpd已经启动成功。

在客户端使用浏览器访问该Web服务器,看到”IT works!”说明服务器可以被正常访问了。

apachectl具体参数如下:

参数            描述
start           启动httpd程序,如果已经启动过该程序则报错
stop            关闭httpd程序
restart         重启httpd程序
graceful        启动httpd,不中断现有的连接
graceful-stop   关闭httpd,不中断现有的连接
status          查看httpd程序当前状态
configtest      检查httpd主配置文件语法

6.2Apache与Tomcat的关系

Apache:侧重于HTTP Server;

Tomcat:侧重于servlet引擎,如果以standalone方式运行,功能上与Apache等效,支持JSP,但对静态网页不太理想; Apache:侧重于HTTP Server;

相同点:

  • 1、两者都是Apache组织开发的
  • 2、两者都有HTTP服务的功能
  • 3、两者都是免费的

不同点:

  • 1、Apache是专门用了提供HTTP服务的,以及相关配置的(例如虚拟主机、URL转发等等)
  • 2、Tomcat是Apache组织在符合J2EE的JSP、Servlet标准下开发的一个JSP服务器

一般使用Apache+Tomcat的话,Apache只是作为一个转发,对JSP的处理是由Tomcat来处理的。

Apache可以支持php/cgi/perl,但是要使用java的话,你需要Tomcat在Apache后台支撑,将java请求由Apache转发给Tomcat处理。

Apache是web服务器,Tomcat是应用(java)服务器,它只是一个servlet(jsp也翻译成servlet)容器,可以认为是Apache的扩展,但是可以独立于Apache运行。

Apache与Tomcat整合的好处是:

  • 1、如果客户端请求的是静态页面,则只需要Apache服务器响应请求
  • 2、如果客户端请求动态页面,则是Tomcat服务器响应请求
  • 3、因为JSP是服务器端解释代码的,这样整合就可以减少Tomcat的服务开销

Apache是一辆卡车,上面可以装一些东西如html等。但是不能装水,要装水必须要有Tomcat这个桶,而这个桶也可以不放在卡车上。

七、MySQL/MariaDB/PostgreSQL、

MySQL、MariaDB 和 PostgreSQL 都是常用的关系型数据库管理系统(RDBMS)。

MySQL 是一种开源关系型数据库管理系统,最初由瑞典 MySQL AB 公司开发。MySQL 以其高性能、可靠性和易用性而闻名,并被广泛应用于 Web 应用程序和企业级软件系统中。

MariaDB 是一个 MySQL 分支,最初由 MySQL 的创始人之一创建,旨在提供一个具有更好性能和安全性的替代品。MariaDB 基本上与 MySQL 兼容,并且可以直接使用现有的 MySQL 数据库和代码。

PostgreSQL 是另一种流行的开源关系型数据库管理系统,它支持 SQL 标准并提供了许多先进的功能,如事务处理、并发控制、触发器等。它被广泛应用于企业级应用程序、数据仓库等领域。

安装

服务器环境

CentOS7 x86_64

[root@slave2 yum.repos.d]# uname -a
Linux slave2 3.10.0-1062.el7.x86_64 #1 SMP Wed Aug 7 18:08:02 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[root@slave2 yum.repos.d]# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)
[root@slave2 yum.repos.d]#

安装mariadb

mariadb的下载地址是:404 | MariaDB

建议采用yum的方式去安装,通过yum安装前最好把/etc/my.cnf文件删除掉,默认数据文件放在/var/lib/mysql目录里,安装前最好也把/var/lib/mysql删除掉避免安装后启动失败(我就是因为好几次没删除干净导致安装失败)。在/etc/yum.repos.d目录下创建MariaDB.repo文件,内容如下

用中科大的镜像网站去下载比官网的快多了!!!

# MariaDB 10.4 CentOS repository list - created 2020-02-25 13:00 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://mirrors.ustc.edu.cn/mariadb/yum/10.4/centos/7/x86_64/
gpgkey=https://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1

然后执行命令 yum -y install MariaDB-server MariaDB-client

如果中间报错 Delta RPMs disabled because /usr/bin/applydeltarpm not installed,则可以通过执行yum -y install deltarpm去解决。

查看/启动/停止/开机启动/开机禁止命令如下

systemctl status/start/stop/enable/disable mariadb

Connector(驱动包)

驱动包可以参考官网去下载MariaDB-Connector

driverClassName = "org.mariadb.jdbc.Driver"

安装mysql

和上面安装MariaDB一样,安装前先删除掉文件/etc/my.cnf和目录/var/lib/mysql避免安装后启动失败。

一样从中科大镜像网站下载,新建mysql.repo文件,内容如下

#
[mysql]
name = mysql
baseurl = https://mirrors.ustc.edu.cn/mysql-repo/yum/mysql-5.7-community/el/7/x86_64
gpgkey = https://mirrors.ustc.edu.cn/mysql-repo/RPM-GPG-KEY-mysql
gpgcheck = 1

然后执行命令yum -y install mysql-server

查看/启动/停止/开机启动/开机禁止命令如下,注意后面是mysqld

systemctl status/start/stop/enable/disable mysqld

安装后会有一个临时密码会存放到/var/log/mysqld.log文件里

如果要修改成简单的密码,如 set password for root@localhost = password('root');

那么会报错 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

对于8.0版本的mysql,最好是通过alter user来修改用户的密码

如alter user 'root'@'%' identified by 'root123';,最好是添加with mysql_native_password

如alter user 'root'@'%' identified with mysql_native_password by 'root123';

这是由于mysql8.0默认用的Authentication Plugin是caching_sha2_password,而以前的mysql版本默认用的是with mysql_native_password,所以添加密码或者修改密码时最好使用with mysql_native_password这样就能和以前保持一样,且能正常使用Navicat Premium 或者SQLyog

对于5.7版本的mysql,解决方法如下:

set global validate_password_policy=0;
set global validate_password_length=1;

对于8.0版本的mysql,解决方法如下。

下面的设置validate_password.length=1的语句可能是不成功的,貌似最低将成长度为4。但是我们不是运维,不要考虑这些细节,要把握重点,分清主次关系。密码设置为root不行的话就设置成为root123吧。

SHOW VARIABLES LIKE 'validate_password%';
set global validate_password.policy=0;
set global validate_password.length=1;

执行上面的命令后再修改密码即可成功。通过mavenMysql-Connector去下载

Connector(驱动包)

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.38</version>
</dependency>


driverClassName = "com.mysql.jdbc.Driver"
jdbcUrl = "jdbc:mysql://slave2:3306/hive?createDatabaseIfNotExist=true"

安装postgresql

最好先删除目录 /var/lib/pgsql,新建 postgresql.repo 文件,内容如下:

[postgresql]
name = postgresql
baseurl = https://mirrors.tuna.tsinghua.edu.cn/postgresql/repos/yum/12/redhat/rhel-7.7-x86_64
gpgkey= https://mirrors.tuna.tsinghua.edu.cn/postgresql/repos/yum/RPM-GPG-KEY-PGDG-12
gpgcheck = 1

然后执行命令 yum install postgresql-server,查看/启动/停止/开机启动/开机禁止命令如下,注意后面是postgresql 。

systemctl status/start/stop/enable/disable postgresql

默认会创建用户postgres,启动服务后切换用户postgres然后再执行psql即可登录到客户端

下面是常用的基本命令,注意每个sql命令必须以分号结尾,字符用单引号:

# 创建用户test并设置密码为test
create user root with password 'root';
# 创建数据库test
create database test;
# 赋予权限
GRANT ALL PRIVILEGES ON DATABASE test TO root;
# 查看版本信息
select version();
# 查看所有数据库
\l
# 切换到hive数据库
\c hive
# 查看当前库所有的表
select * from pg_tables where schemaname='public';

如果想要从其他机器连接到postgresql服务,需要修改两个配置文件

/var/lib/pgsql/data/postgresql.conf文件添加如下内容,该配置在原文件里是注释掉了

# 在所有IP地址上监听,从而允许远程连接到数据库服务器
listen_addresses = '*'

/var/lib/pgsql/data/pg_hba.conf文件

# 允许任意用户从任意机器上以密码方式访问数据库
host    all             all             0.0.0.0/0                md5

Connector(驱动包)

查看Postgresql-Connector

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.2.5</version>
</dependency>


driverClassName = "org.postgresql.Driver"
jdbcUrl = "jdbc:postgresql://slave2:3306/hive?createDatabaseIfNotExist=true"

八、PHP

PHP(全称为“Hypertext Preprocessor”)是一种流行的开源服务器端脚本语言,主要用于 Web 开发。它最初由 Rasmus Lerdorf 在1994年创建,并在其后逐步发展成一个成熟的编程语言。PHP 可以嵌入 HTML 页面中,在服务器端执行脚本代码,生成动态网页内容并将其发送到客户端浏览器。

PHP 语言具有简单易学、开发效率高、功能强大和跨平台等特点。它支持众多数据库类型,如 MySQL、Oracle 和 PostgreSQL 等,并且可以与许多不同的 Web 服务器软件进行集成,如 Apache、Nginx 等。此外,PHP 还提供了大量的扩展库和框架,方便开发人员快速构建复杂的 Web 应用程序。

PHP是能让你生成动态网页的工具之一。PHP网页文件被当作一般HTML网页文件来处理并且在编辑时你可以用编辑HTML的常规方法编写PHP。

PHP代表:超文本预处理器(PHP: Hypertext Preprocessor)。PHP是完全免费的,不用花钱,你可以从PHP官方站点(http://www.php.net)自由下载。PHP遵守GNU公共许可(GPL),在这一许可下诞生了许多流行的软件诸如Linux和Emacs。你可以不受限制的获得源码,甚至可以从中加进你自己需要的特色。PHP在大多数Unix平台,GUN/linux和微软Windows平台上均可以运行。

8.1环境搭建

首先我们需要先安装好apache,我这里用的是appserver来安装的。如果想要上传要公网的服务器上的话可以使用cygwin、ftp,我这里使用的集成IDE是phpstorm,感觉还是非常方便的,这种IDE的风格和androidStudio的都差不多,所以上手非常快,而且可以自动找到浏览器,总之是一款非常不错的IDE。安装配置这里不再重复啰嗦!

常见的名词:

  • cygwin:在windows中模拟linux的环境。
  • apache httped:服务器。
  • Nginx:服务器。
  • xampp:应用服务器,快速搭建开发环境。
  • phpStorm:php集成开发环境。
  • ftp:协议,上传文件。
  • ssh:一个命令,连接服务器。
  • scp:一个命令,上传和下载文件。

8.2php基本语法

在phpstorm中新建一个工程HelloPHP,然后建一个文件夹base,在里面新建一个cc.php,格式就是:

<?php
        echo 'hello php'

在php中,所有用户定义的函数都对大小写不敏感,但是在所有变量对大小写敏感。

常量和变量、数组、函数

我们使用符号来定义变量,在php中很多地方都用到了符号来定义变量,在php中很多地方都用到了,感觉有点像jQuery了,呵呵!

声明变量:

$a=10;
    $a=20;
    $b=5;
    echo $a+$b;

如果要定义常量的话可以使用:

const  THE_VALUE=100;
    echo  THE_VALUE;

也可以用函数来传值:

function traceNum($a,$b)
    {
    echo "a=$a,b=$b";
    }
    traceNum(3,4);

常量只能被赋值一次,而变量可以赋值多次。

流程控制、循环

php的流程控制可以使用if else来处理以及switch,和java类似,可以使用break和continue来控制循环.

下面是一个if循环的例子,这里注意的是elseif是连在一起写的,不要分开,和Oracle中的存储函数类型,存储函数就是elsif来控制的,真的很像,呵呵!

function getLevel($score){
    if($score>90){
    return '优秀';
    }elseif($score>80){
    return '良好';
    }elseif($score>60){
    return '合格';
    }else{
    return '不合格';
    }
    }
    echo getLevel(93);

如果使用switch的话可以这样:

function getLevel($score){
    $result='不合格';
    switch(intval($score/10)){
    case 10;
    case 9:
    $result='优秀';
    break;
    case 8:
    $result='良好';
    break;
    case 7:
    $result='好';
    break;
    case 6:
    $result='合格';
    break;
    default:
    $result='不合格';
    break;
    }
    return $result;
    }
    echo getLevel(93);

类、方法

新建一个类:

<?php      class Hello{     public function sayHello(){     echo 'hello';     }     }

这个地方和java非常相似啦,我就不说了!

就是引入文件使用:require,或者require_once

include  'demo1.php';  //包含,如果没有不会报错。
    require  'demo1.php';  //依赖 ,如果没有就报错
    //同一个php在不同的地方重复引用,
    require_once  'demo1.php';

新建一个man类,构造方法。

class Man
    {
    /**
     * @param $age年龄
     * @param $name   名字
     *
     */
    public  function __construct($age,$name){
       // echo 'Construce  a man';
    $this->_age=$age;
    $this->_name=$name;
    }
    public function getAge(){
    return $this->_age;
    }
    public function getName(){
    return $this->_name();
    }
    private $_age,$_name;
    public static function sayHello(){
    echo 'hello man';
    }
    }

库函数

获取时间:

//获取时间
    //echo  time();
    date_default_timezone_set('Asia/Shanghai');
    //日期
    echo  date('Y-m-d H:i:s');

操作json

//生成json格式的数据
    $arr=array(1,2,3,5,7,'hello');
    echo json_encode($arr);
    $obj=array('h'=>'hello','w'=>'world',array(3,4,5,7));
    echo json_encode($obj);
    //解码
    $jsonStr="{\"h\":\"hello\",\"w\":\"world\",\"0\":[3,4,5,7]}";
    $obj=json_decode($jsonStr);
    echo $obj->h;

创建图片

$img=imagecreate(400,300);
    imagecolorallocate($img,255,255,255);
    header('Content-type:image/png');
    imageellipse($img,200,200,50,50,imagecolorallocate($img,255,0,0));
    imagepng($img);

为图片添加水印

$img=imagecreatefrompng('img.png');
    imagestring($img,5,5,5,'www.tianfang1314.cn',imagecolorallocate($img,255,0,0));
    header('Content-type:image/png');
    imagepng($img);

操作文本

把数据写到data的文本中:

$f=@fopen('data','w');
    fwrite($f,'hello php');
    fclose($f);

把数据从data的文本中读取出来:

$f=@fopen('data','r');
    while(!feof($f)){
    $content=fgets($f);
    echo $content;
    }
    fclose($f);

输出内容:

echo file_get_contents('data');

上传文件:

html页面端:

<form  action="upload.php"  method="post"  enctype="multipart/form-data">
          <input type="file"  name="file"  >
            <input type="submit" value="提交" />
        </form>

php端:

$file=$_FILES['file'];
    $fileName=$file['name'];
    move_uploaded_file($file['tmp_name'],$fileName);

九、Python

Python是一种高级编程语言,由Guido van Rossum在1989年底发明,并在1991年公开发布。它以简单、易读、易学的特点受到了广泛的欢迎和应用。Python具有动态类型、解释性和面向对象等多种特性,被广泛应用于Web开发、数据分析、人工智能等领域。同时,Python还拥有丰富的第三方库和生态系统,使得Python成为了最流行的编程语言之一。

Python在各个编程语言中比较适合新手学习,Python解释器易于扩展,可以使用C语言或C++(或者其他可以通过C调用的语言)扩展新的功能和数据类型。Python也可用于可定制化软件中的扩展程序语言。Python丰富的标准库,提供了适用于各个主要系统平台的源码或机器码。

9.1安装Python3.8

目前,Python有两个版本,一个是2.x版,一个是3.x版,这两个版本是不兼容的。由于3.x版越来越普及,我们的教程将以最新的Python 3.8版本为基础。请确保你的电脑上安装的Python版本是最新的3.8.x,这样,你才能无痛学习这个教程。

在Mac上安装Python

如果你正在使用Mac,系统是OS X>=10.9,那么系统自带的Python版本是2.7。要安装最新的Python 3.8,有两个方法:

方法一:从Python官网下载Python 3.8的安装程序,下载后双击运行并安装;

方法二:如果安装了Homebrew,直接通过命令brew install python3安装即可。

在Linux上安装Python

如果你正在使用Linux,那我可以假定你有Linux系统管理经验,自行安装Python 3应该没有问题,否则,请换回Windows系统。对于大量的目前仍在使用Windows的同学,如果短期内没有打算换Mac,就可以继续阅读以下内容。

在Windows上安装Python

首先,根据你的Windows版本(64位还是32位)从Python的官方网站下载Python 3.8对应的64位安装程序或32位安装程序,然后,运行下载的exe安装包:

特别要注意勾上Add Python 3.8 to PATH,然后点“Install Now”即可完成安装。

运行Python

安装成功后,打开命令提示符窗口,敲入python后,会出现两种情况:

情况一:

看到上面的画面,就说明Python安装成功!

你看到提示符>>>就表示我们已经在Python交互式环境中了,可以输入任何Python代码,回车后会立刻得到执行结果。现在,输入exit()并回车,就可以退出Python交互式环境(直接关掉命令行窗口也可以)。

情况二:得到一个错误:

这是因为Windows会根据一个Path的环境变量设定的路径去查找python.exe,如果没找到,就会报错。如果在安装时漏掉了勾选Add Python 3.8 to PATH,那就要手动把python.exe所在的路径添加到Path中。

如果你不知道怎么修改环境变量,建议把Python安装程序重新运行一遍,务必记得勾上Add Python 3.8 to PATH。

十、Perl

Perl是一种高级的通用编程语言,由Larry Wall在1987年创建。它具有强大的文本处理能力和灵活的特性,在Unix/Linux系统上得到了广泛应用。Perl被设计为一种实用主义语言,可以轻松地完成各种任务,包括文本处理、系统管理、网络编程、Web开发等方面。尽管Perl的流行度已经逐渐下降,但它仍然是许多领域中值得学习的编程语言之一。

Perl易于使用、高效、完整,而不是美观(小巧,优雅,简约)。同时支持过程和面向对象编程,对文本处理具有强大的内置支持,并且拥有第三方模块集合之一。Perl借取了C、sed、awk、shell脚本语言以及很多其他程序语言的特性,其中最重要的特性是它内部集成了正则表达式的功能,以及巨大的第三方代码库CPAN。

10.1主要功能

Perl最初的设计者为拉里·沃尔(Larry Wall),他于1987年12月18日发表。Perl借取了C、sed、awk、shell 脚本语言以及很多其他程序语言的特性。其中最重要的特性是它内部集成了正则表达式的功能,以及巨大的第三方代码库CPAN。

Perl它是术语,而不仅仅是简写,Perl的创造者,Larry Wall提出第一个,但很快又扩展到第二个。那就是为什么‘’Perl‘’没有所有字母都大写。没必要争论哪一个正确,Larry两个都认可。

特点

Perl是由Larry Wall设计的,并由他不断更新和维护的编程语言。

Perl具有高级语言(如C)的强大能力和灵活性。事实上,你将看到,它的许多特性是从C语言中借用来的。

Perl与脚本语言一样,Perl不需要编译器和链接器来运行代码,你要做的只是写出程序并告诉Perl来运行而已。这意味着Perl对于小的编程问题的快速解决方案和为大型事件创建原型来测试潜在的解决方案是十分理想的。

Perl提供脚本语言(如sed和awk)的所有功能,还具有它们所不具备的很多功能。Perl还支持sed到Perl及awk到Perl的翻译器。

简而言之,Perl像C一样强大,像awk、sed等脚本描述语言一样方便。

开源

Perl的解释程序是开放源码的免费软件,使用Perl不必担心费用。Perl能在绝大多数操作系统运行,可以方便地向不同操作系统迁移。

Perl是一种能完成任务的语言。从一开始,Perl就设计成可以把简单工作简单化,同时又不失去处理困难问题能力的语言。它可以很容易操作数字,文本,文件和目录,计算机和网络,特别是程序的语言。这种语言应该很容易运行外部的程序并且扫描这些程序的输出获取感兴趣的东西。而且它还应该很容易能把这些你感兴趣的东西交给其它程序做特殊的处理。当然,这种语言还应该很容易在任何现代的操作系统上可以移植地编译和运行。

语法

  • 变量定义,以$号开头,如:$num =1;
  • 数组定义,以@开头,如:@array = (1,2,3);
  • 数组元素调用 $array[index],其中index表示数组下标,如上例,$array[0]的值是1
  • 哈希定义,以%开头,如:%hash=("a",1,"b",2);
  • 哈希调用 %hash,其中key表示键,多用字符串表示,注意hash的key必须具有独一性,但value可以不独一,为此hash的key经常被用来做独一化处理,如上例中的"a", "b", values是key对应的值,如1,2。$hash{"b"}的值是2。

优点

Perl追求的是简单, 解决一个一般的问题用它几行代码就完成了. 一个稍复杂一点的问题代码也不会超过一屏! 在软件测试中,Perl通常是非常重要的角色。一般一个测试通用函数库就要分十几个文件,甚至更多,包含多达上千个定制功能。而这些函数将在主函数运行时,不定数量的被调用。几乎可以说,一切自动过程都是由Perl自己完成的,可见其功能的强大和在当今计算机技术高速发展的时期仍然发挥着重要的作用。

Perl最初是当做一种Unix的脚本语言设计的,但是它早就移植到大多数其它操作系统里了。因为Perl几乎可以在任何地方运行,所以Perl可以说是当今最具有移植性的编程环境;要想写可移植的C/C++程序,你得在程序里加上一大堆 #ifdef标签来区分不同的系统;要想写可移植的Java程序,你必须理解每种新的Java实现的特质;要想写可移植的shell,你可能要记住每条命令在每种操作系统上的语法,走运的时候你可能可以找到一些公共的东西;要想写可移植的Visual Basic程序,需要对‘’移植‘’有个更灵活的定义。

让我们很高兴的是Perl避免了所有这些问题,同时还保留了这些语言中的许多优点,同时还有一些自己的特色。Perl的特色来自许多方面:它的特性集的工具,Perl社区的创造性,以及开源运动的大环境。不过,许多这些特性都是混合的东西;Perl的身世复杂,它总是把事物看成是优点的不同方面,而不是弱点。Perl是‘’背黑锅我来‘’的语言。如果你觉得自己陷入一团乱麻之中,非常渴望自由,那么请使用Perl。

Perl是跨文化的。Perl的爆炸性增长很大程度上是因为那些前Unix系统程序员的渴望,他们希望从他们的‘’老家‘’带着尽可能多的东西。对于他们而言,Perl是可移植的Unix化蒸馏器,是"此路不通"的沙漠中的绿洲。从另外一个角度来看,Perl还可以从另外一个方向运转:在Windows上工作的web设计者通常会非常开心地发现他们的 Perl程序可以不加修改地在Unix服务器上跑。

尽管Perl在系统程序员和web设计师中间非常流行,但这只是因为是他们最早发现Perl的,Perl可以用于更广泛的用途。从Perl最早的文本处理语言开始,它已经发展成为一种非常复杂的,通用的编程语言,以及完整的开发环境,包括调试器,调节器,交叉引用,编译器,库,语法提示编辑器,以及所有其它‘’真正‘’的编程语言所具有的所有挂勾,只要你需要。当然这些东西都是让我们可能处理难的问题的东西,而且很多其它语言也可以做到这一点。Perl之所以成为Perl是因为它从来不会因为保持简单事情简单化而丢失其他方面的特性。

因为Perl既强大又好用,所以它被广泛地用于日常生活的方方面面,从宇航工程到分子生物学,从数学到语言学,从图形处理到文档处理,从数据库操作到网络管理。很多人用Perl进行快速处理那些很难分析或转换的大批量数据,不管你是处理DNA序列,网页,还是猪肚皮的未来都无所谓。实际上,在Perl社区有一个笑话就是,下次股市大崩盘就很有可能是哪个家伙写的脚本里头有bug造成的。(不过,乐观点来看就是,任何还在失业的股票分析师仍然有可以利用的技巧。)

Perl的成功有许多原因。Perl早在开源软件的名字出现之前就已经是一个成功的开源项目了。Perl是自由的,并将永远自由下去。你可以在任何合适的场合使用 Perl,只需要遵守一个非常自由的版权就可以了。如果你在从事商业活动并且还想使用Perl,那么用就是了。你可以把Perl嵌入到你写的商业软件中而不需要支付任何费用也没有任何限制。如果你碰上一个Perl社区解决不了的问题,那你也还有最后的一招:源程序本身。 Perl社区不会在‘’升级‘’的伪装下租给你它们的商业秘密。而且Perl社区也不会‘’停业 ‘’,更不会让你孤立无援。

Perl是自由软件这一点无疑对它是有帮助的。但这一条并不足以解释Perl现象,因为许多自由软件包没有能繁荣起来。Perl不仅自由;而且好玩。人们觉得自己在Perl里可以有创造力,因为它们有表达的自由:他们可以选择是为计算机速度优化还是为程序员的速度优化,是冗长还是简洁,是选择可读性还是可维护性,或者选择复用性,移植性,接受性和传授性等等。假如你进入一次模糊的Perl比赛,甚至你还可以为模糊性做优化。

Perl可以给予你所有这些自由,因为它是一门有着分裂人格的语言。Perl同时是很简单并且很富有的语言。Perl从其它地方拿来好主意,然后把它们安装到易用的框架里面。对于只是喜欢她的人来说,Perl是实用抽取和报表语言(Practical Extractoin and Report Language)。对那些热爱她的人而言,她是变态电子垃圾制造者(Pathologically Electric Rubbish Lister)。在少数人眼里,Perl是毫无意义的重复练习。不过世界需要一点点冗余。精简主义者总是想把事物分隔开。而我们则总是企图把它们合并到一起。

Perl之所以是简单的语言是有很多原因的。比如你用不着知道什么特殊的指令就可以编译Perl程序--只要把它当做批处理或者 shell脚本执行就可以了。Perl的类型和结构很容易使用和理解。Perl对你的数据没有任何限制--你的字串和数组可以要多长就多长(只要你有足够的内存),而且它们都会自动增长。Perl不会强迫你学习新的语法和语意,Perl改从许多其它你已经熟悉的语言里(比如C, awk, BASIC 和 Python, 英文,希腊语等)借来语法。实际上,任何程序员都可以从书写良好的Perl代码段中读懂它的含义。

最重要的是,你不用先学习所有Perl的东西就可以开始写有用的程序。你可以写很小的Perl程序。你也可以象小孩那样写Perl程序,保证不会笑话你。或者更准确地说是,绝不会笑话小孩做事情的创造性。Perl里的许多观点都是从自然语言中借来的,其中一条最好的观点就是只要你能把自己的意思表述清楚,那么你就可以使用这些语言的一个子集。Perl文化可以接受任何熟练程度的成员。不会在你背后放个语言警察。如果你的老板不炒你,而且你的Perl脚本也能完成工作,那么它就是‘’正确‘’的。

尽管Perl很简单,但它仍然是一种特性很丰富的语言,如果你想用那些特性的话,那你就要学习一些东西。这也是把难题变简单的学费。虽然你要想把所有Perl能做的事情吸收还需要一些时间,但到你需要这些功能的时候你就会非常开心地发现Perl已经可以做这些事情了。

由于Perl的继承性,就算它只是用做数据归纳语言的时候也有丰富的特性,Perl一开始就设计成可以浏览文件,扫描大量文本并且生成动态数据以及打印出这些数据的良好格式化的报表。不过,随后 Perl 就开始风行,于是它就成了可以操作文件系统,进程管理,数据库管理,进行C/S编程和安全编程,web信息管理,甚至可以进行面向对象和面向功能的编程的语言。而且这些功能并非只是在Perl这边,每种新功能都和其它东西交流得很好,别忘了Perl从一开始就是设计成胶水语言的。

而且Perl并不仅仅只能黏合它自己的特性。Perl是设计成可以用模块扩展的语言。你可以用Perl快速设计,编写,调试和部署Perl应用,并且你还可以在需要的时候很方便地扩展这些应用。你可以在其它语言里嵌入Perl,而且你也可以在Perl里嵌入其它语言。通过模块输入机制,你可以把这些外部的扩展当做内置于Perl的特性。那些面向对象的外部库在Perl内部仍然保持面向对象的特征。

Perl还在许多其它方面协助你。和严格的每次执行一条命令的命令文件和shell脚本不同的是,Perl先把你的程序快速编译成一种内部格式。和其它任何编译器一样,这个时候还进行各种优化,同时把碰到的任何问题反馈给你。一旦Perl的编译器前端对你的程序表示满意了,它就把这些中间代码交给解释器执行(或者是给其它的能生成C或者字节码的模块后端)。听起来挺复杂,不过Perl的编译器和解释器干这些活效率相当高,编译-运行-修改的过程几乎都是以秒计。再加上Perl的许多其他开发特性,这种快速的角色转换很适合做快速原型设计。然后随着你的程序的成熟,你可以逐步拧紧身上的螺母,减少散漫增强纪律。如果你做得好,Perl也能帮你这个忙。

Perl还可以帮你写更安全的程序。除了其它语言提供的典型的安全接口之外,Perl还通过一种跟踪数据的机制给你提供预防意外安全错误的保护,这样就可以在灾害发生之前预防其发生。最后,Perl还可以让你设置一个特殊的防护隔段运行那些来源不明的Perl代码,以此来杜绝危险操作。

不过,偏执一点儿说,Perl 帮你的大部分内容和Perl本身没有什么关系,而是和使用Perl的人有关。坦率地说,Perl社区的人们可以说是地球上最热心的人了。如果Perl运动里面有那么一点点宗教色彩的话,那么这就是它的核心了。Larry希望Perl社区像一小片天堂那样运转,看来他的愿望基本上是实现了。也请你为此做出自己的努力。

Perl之所以强大, 是因为有CPAN, CPAN上面有无数的开源模块, 从科学计算到桌面应用到网络等等各个方面都有大量的模块! 并且世界上也还有无数的人在向上面添加模块! 如果你想要用PERL实现某功能, 不用自己做, 在CPAN上面搜一搜, 多半都会得到已有的结果! CPAN("the Comprehensive Perl Archive Network"全面的Perl存档网络)是查找任何Perl有关的东西的中心仓库。它包含从整个Perl社区收集来的智慧:成百上千的Perl模块和脚本,相当于好几本书的文档,以及整个Perl发布。如果有东西是用Perl写的,而且这个东西很有用而且是自由的,那么它很有可能就在CPAN上。

缺点

也正是因为Perl的灵活性和‘’过度‘’的冗余语法,也因此获得了write-only的‘’美誉‘’,因为许多Perl程序的代码令人难以阅读,实现相同功能的程序代码长度可以相差十倍百倍。但Perl同样可以将代码书写得像Python或Ruby等语言一样优雅。

很多时候,perl.exe进程会占用很多的内存空间,虽然只是一时,但是感觉不好。

讲述了Perl的构成和特点,并且穿插着Perl本身实现的方方面面的设计思想,举个例子来说就是引入了语言环境的做法,这种语言层次的语言环境让程序员在写程序的时候更多地像是在‘’说‘’,而不是在‘’解释‘’,我甚至可以说理解语言环境是了解和掌握Perl的一个关键等内容。

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
5天前
|
缓存 算法 Linux
深入理解Linux内核调度器:公平性与性能的平衡####
真知灼见 本文将带你深入了解Linux操作系统的核心组件之一——完全公平调度器(CFS),通过剖析其设计原理、工作机制以及在实际系统中的应用效果,揭示它是如何在众多进程间实现资源分配的公平性与高效性的。不同于传统的摘要概述,本文旨在通过直观且富有洞察力的视角,让读者仿佛亲身体验到CFS在复杂系统环境中游刃有余地进行任务调度的过程。 ####
26 6
|
4天前
|
缓存 资源调度 安全
深入探索Linux操作系统的心脏——内核配置与优化####
本文作为一篇技术性深度解析文章,旨在引领读者踏上一场揭秘Linux内核配置与优化的奇妙之旅。不同于传统的摘要概述,本文将以实战为导向,直接跳入核心内容,探讨如何通过精细调整内核参数来提升系统性能、增强安全性及实现资源高效利用。从基础概念到高级技巧,逐步揭示那些隐藏在命令行背后的强大功能,为系统管理员和高级用户打开一扇通往极致性能与定制化体验的大门。 --- ###
19 9
|
2天前
|
缓存 负载均衡 Linux
深入理解Linux内核调度器
本文探讨了Linux操作系统核心组件之一——内核调度器的工作原理和设计哲学。不同于常规的技术文章,本摘要旨在提供一种全新的视角来审视Linux内核的调度机制,通过分析其对系统性能的影响以及在多核处理器环境下的表现,揭示调度器如何平衡公平性和效率。文章进一步讨论了完全公平调度器(CFS)的设计细节,包括它如何处理不同优先级的任务、如何进行负载均衡以及它是如何适应现代多核架构的挑战。此外,本文还简要概述了Linux调度器的未来发展方向,包括对实时任务支持的改进和对异构计算环境的适应性。
18 6
|
3天前
|
缓存 Linux 开发者
Linux内核中的并发控制机制:深入理解与应用####
【10月更文挑战第21天】 本文旨在为读者提供一个全面的指南,探讨Linux操作系统中用于实现多线程和进程间同步的关键技术——并发控制机制。通过剖析互斥锁、自旋锁、读写锁等核心概念及其在实际场景中的应用,本文将帮助开发者更好地理解和运用这些工具来构建高效且稳定的应用程序。 ####
18 5
|
1天前
|
算法 Linux 调度
深入理解Linux内核调度器:从基础到优化####
本文旨在通过剖析Linux操作系统的心脏——内核调度器,为读者揭开其高效管理CPU资源的神秘面纱。不同于传统的摘要概述,本文将直接以一段精简代码片段作为引子,展示一个简化版的任务调度逻辑,随后逐步深入,详细探讨Linux内核调度器的工作原理、关键数据结构、调度算法演变以及性能调优策略,旨在为开发者与系统管理员提供一份实用的技术指南。 ####
14 4
|
4天前
|
算法 Unix Linux
深入理解Linux内核调度器:原理与优化
本文探讨了Linux操作系统的心脏——内核调度器(Scheduler)的工作原理,以及如何通过参数调整和代码优化来提高系统性能。不同于常规摘要仅概述内容,本摘要旨在激发读者对Linux内核调度机制深层次运作的兴趣,并简要介绍文章将覆盖的关键话题,如调度算法、实时性增强及节能策略等。
|
5天前
|
存储 监控 安全
Linux内核调优的艺术:从基础到高级###
本文深入探讨了Linux操作系统的心脏——内核的调优方法。文章首先概述了Linux内核的基本结构与工作原理,随后详细阐述了内核调优的重要性及基本原则。通过具体的参数调整示例(如sysctl、/proc/sys目录中的设置),文章展示了如何根据实际应用场景优化系统性能,包括提升CPU利用率、内存管理效率以及I/O性能等关键方面。最后,介绍了一些高级工具和技术,如perf、eBPF和SystemTap,用于更深层次的性能分析和问题定位。本文旨在为系统管理员和高级用户提供实用的内核调优策略,以最大化Linux系统的效率和稳定性。 ###
|
4天前
|
Java Linux Android开发
深入探索Android系统架构:从Linux内核到应用层
本文将带领读者深入了解Android操作系统的复杂架构,从其基于Linux的内核到丰富多彩的应用层。我们将探讨Android的各个关键组件,包括硬件抽象层(HAL)、运行时环境、以及核心库等,揭示它们如何协同工作以支持广泛的设备和应用。通过本文,您将对Android系统的工作原理有一个全面的认识,理解其如何平衡开放性与安全性,以及如何在多样化的设备上提供一致的用户体验。
|
3天前
|
缓存 运维 网络协议
深入Linux内核架构:操作系统的核心奥秘
深入Linux内核架构:操作系统的核心奥秘
18 2
|
6天前
|
监控 网络协议 算法
Linux内核优化:提升系统性能与稳定性的策略####
本文深入探讨了Linux操作系统内核的优化策略,旨在通过一系列技术手段和最佳实践,显著提升系统的性能、响应速度及稳定性。文章首先概述了Linux内核的核心组件及其在系统中的作用,随后详细阐述了内存管理、进程调度、文件系统优化、网络栈调整及并发控制等关键领域的优化方法。通过实际案例分析,展示了这些优化措施如何有效减少延迟、提高吞吐量,并增强系统的整体健壮性。最终,文章强调了持续监控、定期更新及合理配置对于维持Linux系统长期高效运行的重要性。 ####