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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: 深入理解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
相关文章
|
14天前
|
算法 Linux
深入探索Linux内核的内存管理机制
本文旨在为读者提供对Linux操作系统内核中内存管理机制的深入理解。通过探讨Linux内核如何高效地分配、回收和优化内存资源,我们揭示了这一复杂系统背后的原理及其对系统性能的影响。不同于常规的摘要,本文将直接进入主题,不包含背景信息或研究目的等标准部分,而是专注于技术细节和实际操作。
|
14天前
|
存储 缓存 网络协议
Linux操作系统的内核优化与性能调优####
本文深入探讨了Linux操作系统内核的优化策略与性能调优方法,旨在为系统管理员和高级用户提供一套实用的指南。通过分析内核参数调整、文件系统选择、内存管理及网络配置等关键方面,本文揭示了如何有效提升Linux系统的稳定性和运行效率。不同于常规摘要仅概述内容的做法,本摘要直接指出文章的核心价值——提供具体可行的优化措施,助力读者实现系统性能的飞跃。 ####
|
15天前
|
监控 算法 Linux
Linux内核锁机制深度剖析与实践优化####
本文作为一篇技术性文章,深入探讨了Linux操作系统内核中锁机制的工作原理、类型及其在并发控制中的应用,旨在为开发者提供关于如何有效利用这些工具来提升系统性能和稳定性的见解。不同于常规摘要的概述性质,本文将直接通过具体案例分析,展示在不同场景下选择合适的锁策略对于解决竞争条件、死锁问题的重要性,以及如何根据实际需求调整锁的粒度以达到最佳效果,为读者呈现一份实用性强的实践指南。 ####
|
15天前
|
缓存 监控 网络协议
Linux操作系统的内核优化与实践####
本文旨在探讨Linux操作系统内核的优化策略与实际应用案例,深入分析内核参数调优、编译选项配置及实时性能监控的方法。通过具体实例讲解如何根据不同应用场景调整内核设置,以提升系统性能和稳定性,为系统管理员和技术爱好者提供实用的优化指南。 ####
|
17天前
|
负载均衡 算法 Linux
深入探索Linux内核调度机制:公平与效率的平衡####
本文旨在剖析Linux操作系统内核中的进程调度机制,特别是其如何通过CFS(完全公平调度器)算法实现多任务环境下资源分配的公平性与系统响应速度之间的微妙平衡。不同于传统摘要的概览性质,本文摘要将直接聚焦于CFS的核心原理、设计目标及面临的挑战,为读者揭开Linux高效调度的秘密。 ####
32 3
|
20天前
|
负载均衡 算法 Linux
深入探索Linux内核调度器:公平与效率的平衡####
本文通过剖析Linux内核调度器的工作机制,揭示了其在多任务处理环境中如何实现时间片轮转、优先级调整及完全公平调度算法(CFS),以达到既公平又高效地分配CPU资源的目标。通过对比FIFO和RR等传统调度策略,本文展示了Linux调度器如何在复杂的计算场景下优化性能,为系统设计师和开发者提供了宝贵的设计思路。 ####
32 6
|
19天前
|
消息中间件 安全 Linux
深入探索Linux操作系统的内核机制
本文旨在为读者提供一个关于Linux操作系统内核机制的全面解析。通过探讨Linux内核的设计哲学、核心组件、以及其如何高效地管理硬件资源和系统操作,本文揭示了Linux之所以成为众多开发者和组织首选操作系统的原因。不同于常规摘要,此处我们不涉及具体代码或技术细节,而是从宏观的角度审视Linux内核的架构和功能,为对Linux感兴趣的读者提供一个高层次的理解框架。
|
21天前
|
缓存 并行计算 Linux
深入解析Linux操作系统的内核优化策略
本文旨在探讨Linux操作系统内核的优化策略,包括内核参数调整、内存管理、CPU调度以及文件系统性能提升等方面。通过对这些关键领域的分析,我们可以理解如何有效地提高Linux系统的性能和稳定性,从而为用户提供更加流畅和高效的计算体验。
29 2
|
21天前
|
缓存 网络协议 Linux
深入探索Linux操作系统的内核优化策略####
本文旨在探讨Linux操作系统内核的优化方法,通过分析当前主流的几种内核优化技术,结合具体案例,阐述如何有效提升系统性能与稳定性。文章首先概述了Linux内核的基本结构,随后详细解析了内核优化的必要性及常用手段,包括编译优化、内核参数调整、内存管理优化等,最后通过实例展示了这些优化技巧在实际场景中的应用效果,为读者提供了一套实用的Linux内核优化指南。 ####
44 1
|
21天前
|
算法 前端开发 Linux
深入理解Linux内核调度器:CFS与实时性的平衡####
本文旨在探讨Linux操作系统的核心组件之一——完全公平调度器(CFS)的工作原理,分析其在多任务处理环境中如何实现进程间的公平调度,并进一步讨论Linux对于实时性需求的支持策略。不同于传统摘要仅概述内容要点,本部分将简要预览CFS的设计哲学、核心算法以及它是如何通过红黑树数据结构来维护进程执行顺序,同时触及Linux内核为满足不同应用场景下的实时性要求而做出的权衡与优化。 ####