lab-00: 实验须知、环境、基础
Solidity是什么?
Solidity 是一种面向合约的高级编程语言,专门为实现智能合约而设计。你可以把它想象成一种为区块链世界量身定制的编程语言。
特点
面向合约: Solidity 的核心概念是合约。合约是一段代码,一旦部署到区块链上,就会自动执行,无法篡改。这使得合约非常适合用于构建去中心化的应用程序(DApp)。
Linux 系统下的可执w行文件 ELF
ELF (Executable and Linkable Format) 是 Linux 系统下广泛使用的可执行文件格式。它包含了程序执行所需的所有信息,包括代码、数据、符号表、调试信息等。
ELF 与 PE 的区别
平台差异: ELF 主要用于类 Unix 系统(如 Linux、macOS),而 PE (Portable Executable) 主要用于 Windows 系统。
结构差异: 虽然两者都是可执行文件格式,但它们的内部结构和组织方式有很大不同。
Linux 系统下的环境变量
环境变量是操作系统提供的一种机制,用于存储程序运行时的配置信息。
每个进程都有自己的环境变量,这些变量可以通过 shell 命令设置和查看。
常用环境变量
- PATH: 指定可执行文件的搜索路径。
- LD_LIBRARY_PATH: 指定共享库的搜索路径。
- HOME: 用户的主目录。
- SHELL: 默认的 shell。
Linux 下通过 gcc/clang 完成 C 代码的编译
Linux 下通过 gdb 完成对可执行程序的调试
Makefile 以及 make 工具
Foundry/Remix 工具的使用
Foundry 和 Remix 都是zl非常流行的智能合约开发工具
Remix 是学习 Solidity 的绝佳选择,更适合初学者和小型项目,它提供了一个简单易用的开发环境,可以帮助你快速入门智能合约开发。
Foundry 更适合专业开发者和大型项目,它提供了丰富的功能和工具,可以帮助你构建高质量的智能合约。
进程间通信
什么是进程
进程是程序的执行过程,是动态的,随着程序的使用被创建,随着程序的结束而消亡。可以说进程是一个独立的可调度的任务。进程是系统调度的独立任务。进程是程序执行的独立任务。进程是资源(内存资源)管理的最小任务
fork系统调用用于创建一个新进程,称为子进程,它与父进程同时运行(并发),且运行顺序不定(异步)。
fork()
函数如果成功调用一次返回两个值,一共可能有三种不同的返回值:
-
在父进程中,fork返回新创建子进程的进程ID;
-
在子进程中,fork返回0;
- 如果出现错误,fork返回一个负值。
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{
pid_t child;
child = fork();
if(child == 0)//子进程抢到处理机资源并运行
{//子进程运行代码
for(int i = 0; i < 3; i++)
{
printf("I am child!\n");
sleep(1);
}
}
else if(child > 0)//父进程抢到处理机资源并运行
{//父进程运行代码
for(int i = 0; i < 3; i++)
{
printf("I am parent!\n");
sleep(1);
}
}
return 0;
}
父进程与子进程并发运行,且运行顺序不一定(可以调整循环次数观察结果)
什么是管道
管道是两个进程之间的连接,一个进程的标准输出成为另一个进程的标准输入。在UNIX操作系统中,管道用于进程间通信。
- 管道只是单向通信,即我们可以这样使用管道:一个进程向管道写入数据,另一个进程从管道读取数据。
- 管道,是内存中被视为“虚拟文件”的一块区域。
- 管道可以被创建进程及其所有子进程读写。
当我们在任何进程中使用fork时,文件描述符在子进程和父进程之间保持打开状态。如果我们在创建管道后调用fork,则父级和子级可以通过管道进行通信。
- 管道表现为FIFO(先进先出),管道实现类似队列数据结构。读写大小不是必须一致。在管道中,我们可以一次写入512字节,但可以一次只读取1字节。
- 如果在某个内容写入管道之前,某个进程试图读取该内容,则该进程将挂起,直到内容被写入。