C#编程概述(三)
C#示例1234567891011121314151617//SimpleProgram.csusing System; //注释:引入命名空间using System.Collections.Generic;using System.Linq;using System.Text;namespace Simple{ class Program //Program类 { static void Main(string[] args) //Main方法 { Console.WriteLine("Hello World!"); Console.ReadKey(); } }} 标识符标识符是一种字符串,用来命名变量,方法,参数等其他程序结构。命名规则:C#基本语法|标识符 标识符必须以字母、下划线或@开头,后面可以跟一系列的字母、数字(0-9)、下划线(_)、@。 标识符中的第一个字符不能是数字。 ...
C#与.NET框架(二)
.NET Framework简介早期的Windows编程有许多分支,有用Win32 API的,有用MFC(Microsoft Foundation Class,微软基础类库)的,还有用COM(Component Object Model,组件对象模型)。 然而这些技术都有自己的问题,纯Win32 API不是面向对象的,工作量大,MCFC是面向对象的,但它不一致且逐渐陈旧,COM虽然概念简单,但实际代码复制,且需要丑陋,不雅的底层基础代码。 .NET Framework是Microsoft为开发应用程序而创建的一个具有革命意义的平台。 多平台,可以运行在多个操作系统上:Windows,Linux, macOS 未限制应用程序的类型:桌面应用程序、Windows桌面应用程序(UWP)、云/Web应用程序、Web API、其他各种类型的应用程序 对于Web、云和Web API应用程序,按照定义是多平台的应用程序,因为任何带有Web浏览器的系统都可以访问 可以用于各种语言:C#, C++, F#, JavaScript, Visual Basic, COBOL及其他旧语言 .NET ...
C#编程系列说明(一)
打算把最近学习的C#编程知识进行一个总结,主要学习途径来源: SiKi学院C#编程基础的视频C#编程-第一季 《C#入门经典(第八版)》的pdf 《C#图解教程(第五版)》的pdf 一些常用的资料链接C#菜鸟教程: https://www.runoob.com/csharp/csharp-tutorial.html C#语言微软官方文档: https://learn.microsoft.com/zh-cn/dotnet/csharp/tour-of-csharp/ 工具与配置Visual Studio 2019 字体推荐:JetBrains Mono\ConsolasJetBrains Mono字体下载 思维导图工具:Xmind,ProcessOn,百度脑图 vs2019里常用的快捷键 Home键和End键,将光标定位到一行的开头和结尾。 Ctrl+a(全选) Ctrl+s(保存) Ctrl+z(取消回退操作) Ctrl+x(剪切) Ctrl+c(复制) Ctrl+v(粘贴) F5(调试) Ctrl+F5(不调试执行) Ctrl + K, Ctrl + F (格式化当前行&...
使用hexo+nginx服务器搭建个人博客
系统基础依赖安装(先执行)我的版本是Ubuntu 26.04 LTS,打算使用NVM安装Hexo 8。 12345#查看linux版本uname -a cat /etc/os-releaselsb_release -ahostnamectl 12345678# 更新软件源 sudo apt update && sudo apt upgrade -y # 安装 curl、git(Hexo与NVM必需) sudo apt install curl git -y# 验证版本 node -v npm -v 安装NVM(Node 版本管理器)123456789curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.5/install.sh | bash # 加载nvm到当前终端 export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" [...
Haskell趣学指南
很久之前看到朋友们讨论: 函数式编程,柯里函数,类型类,函子,Monoid…一堆酷炫的东西,心神往之,早已埋下了好奇的种子,所以趁着国庆假期就买了本《Haskell趣学指南》,试图一窥函数式编程的面貌。写这篇博客一方面是让我自己对Haskell 更熟练,另一方面是希望能够分享我的学习经验,帮助初学者更快进入状况。 如果你也想简单的了解一下Haskell,这里还有该书的web版本《Haskell趣学指南》(我还是喜欢纸质书的写写画画~)。 从零开始通过apt-get install Haskell-platform命令即可在Ubuntu下安装Haskell的GHC版本编译器。GHC可以解释执行.hs结尾的Haskell Script,ghci命令进行交互试模式,输入:l myfunctions.hs即可执行对应的myfunctions.hs文件。 12GHCi, version 8.0.2: http://www.haskell.org/ghc/ :? for helpPrelude> haskell会按照运算中优先级执行计算,也支持使用括号改变计算的优...
APUE(七)网络IPC:套接字
OSI模型在这里不详细展开tcp/ip计算机网络相关知识,可能会专门写一篇这方面文章吧。 详细了解可看程皓的博客文章:TCP的那些事(上)与TCP的那些事(下)。 传输层:TCP/UDP原理简介用户数据报协议(UDP)UDP提供无连接的服务,是一个简单的传输协议,应用程序往一个UDP套接字写入一个消息,该消息随后被封装到一个UDP数据报,该UDP数据报进而又被封装到一个IP数据报,然后发往目的地。 UDP不保证UDP数据报会到达其最终目的地,不保证各个数据报的先后顺序跨网络后保持不变,也不保证 每个数据报只到达一次。 传输控制协议(TCP)TCP提供有连接服务,先建立连接,在交换数据,最终关闭连接。 TCP还提供可靠性(reliability)。当TCP向另一端发送数据时,它要求对端返回一个确认。如果没有收到确认,TCP就自动重传数据并等待更长时间。在数次重传失败后,TCP才放弃。 TCP含有用于动态估算客户和服务器之间的往返时间(round-trip time, RTT)的算法,以便它知道等待一个确认需要多少时间。 TCP通过给其中每个字节关联一个序列...
APUE(六)高级IO
IO模型 阻塞IO 非阻塞IO I/O复用 信号驱动IO(SIGIO) 异步IO(POSIX的aio_系列函数) 一个输入输出通常包含两个不同阶段: 等待数据准备好。 从内核向进程复制数据。 对于一个套接字上的输入输出操作: 第一步通常涉及等待数据从网络中到达。当所等待分组到达时,它被复制到内核中的某个缓冲区。 第二步就是把数据从内核缓冲区复制到应用进程缓冲区。 五种IO模型阻塞式IO模型 如图所示,进程调用recvfrom,其系统调用直到数据报到达且被复制到应用进程的缓冲区中或者发生错误时才返回。(从调用recvfrom开始到它返回的整段时间内是被阻塞的) 非阻塞式IO模型进程把一个套接字设置成非阻塞的是在通知内核:当所请求的I/O操作非得把本进程投入睡眠才能完成时,不要把本进程投入睡眠,而是返回一个错误。 当一个进程像上图这样对一个非阻塞描述符循环调用时,称这种行为为:轮询(polling)。 I/O复用IO复用模型指,可以调用IO复用函数,进程阻塞在IO复用函数上,而不是阻塞在I/O系统调用上,当等待事件发生后,在调用对应...
APUE(五)线程
线程线程创建线程ID只有在它所属的进程上下文中才有意义。 123456#include<pthread.h>int pthread_equal(pthread_t tid1, pthread_t tid2);int pthread_self(void); //调用线程获取自身的线程IDint pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg); 新创建的线程ID会被设置为tidp指向的内存单元。attr参数用于定制各种不同的线程属性。新创建的线程从start_rtn函数的地址开始运行,该函数只有一个无类型指针参数arg。 每个线程都提供errno的副本。 1234567891011121314151617181920212223242526272829303132#include "apue.h"#include <pthread.h...
APUE(四)进程间通信(IPC)
进程间通信(InterProcess Communication, IPC) 匿名管道 有名管道 信号 消息队列 共享内存 信号量 套接字 管道匿名管道 历史上,管道是半双工的(即数据只能在一个方向上流动)。现在某些系统提供全双工管道,但是为了最佳可移植性,不应预先假定系统支持全双工管道。 匿名管道只能在具有公共祖先的两个进程之间使用。通常,一个管道由一个进程创建,在进程调用fork之后,这个管道就能在父进程和子进程之间使用了。 pipe函数创建管道,fd[0]为读而打开,fd[1]为写而打开。 12#include<unsitd.h>int pipe(int fd[2]); 通常,进程会先调用pipe,接着调用fork,从而创建从父进程到子进程的IPC通道。 fork之后做什么取决于我们想要的数据流的方向。对于从父进程到子进程的管道,父进程关闭管道的读端(fd[0]),子进程关闭写端(fd[1])。状态结构如下图所示。 当读(read)一个写端已被关闭的管道时,在所有数据都被读取后,read返回0,表示文件结束。 如果写(write)一个读端已被关闭的管道,...
APUE(三)信号
信号都以SIG开头,信号名都被定义为正整数常量,不存在编号为0的信号,kill函数对信号编号0有特殊的应用,这种信号称为空信号。 很多条件可以产生信号: 当用户按某些终端键,引发终端产生的信号 硬件产生的信号:除数为0,无效内存引用 进程调用kill函数可将任意信号发送给另一个进程或进程组 用户可调用kill命令将信号发送给其他进程 当检测到某种软件条件已经发生,并将其通知有关的进程时也产生信号 在某个信号出现时,可以告诉内核按照下列三种方式之一处理 忽略,大多数信号可以使用这种方式进行处理,但时SIGKILL和SIGSTOP不能被忽略,因为他们向内核和超级用户提供了使进程终止的可靠方法。 捕捉,做到这一点的前提是要通知内核在某种信号发生时,调用一个用户函数,在用户函数中对这种事件进行处理 执行系统默认动作,大多数信号的系统默认动作是终止进程 在系统默认动作中,有的默认动作会在进程当前工作目录中生成core文件(中间复制了该进程的内存映像)下面几种条件不产生core文件: 进程是设置用户id的,而且当前用户并非程序文件的所有者 进程是设置组id的 用户没有写当前工作目录...
