添加 Host 加速访问 github
查询网址 ip打开 ipaddress 网址 https://www.ipaddress.com/
然后查询以下地址的 IP 地址
github.comassets-cdn.github.comgithub.global.ssl.fastly.net
修改 Host
windows host 路径:C:\Windows\System32\drivers\etc\hosts
Linux host 路径:/etc/hosts
然后添加查询到的 IP 地址,例如:
140.82.114.3 github.com185.199.108.153 assets-cdn.github.com185.199.109.153 assets-cdn.github.com185.199.110.153 assets-cdn.github.com185.199.111.153 assets-cdn.github.com199.232.5.194 github.global.ssl.fastly.net
刷新 DNS
windows:
ipconfig /flushdns
Linux:
sudo /etc ...
C/C++ 位操作
关于位操作的几个术语:
设置(set):将数二进制的某一位置 1
清除(clear):将数二进制的某一位 1 清除,变为 0
将数字的二进制某一位置 1
首先将 1 左移 n 位
然后将结果与数字进行或(|)操作
#include <iostream>void set(int& num, int n) { num |= 1 << n;}int main() { int num = 2; // 0010 int n = 2; // 将第 2 位(0 开始)置 1 set(num, n); // 0110 std::cout << num << std::endl;}
清除数字的二进制某一位(置 0)
首先将 1 左移 n 位
然后对上面的结果取反(~)
然后与数字进行与(&)运算
#include <iostream>void unset(int& num, int n) { num &= (~(1 ...
僵尸进程及其预防
原文地址:Zombie Processes and their Prevention
僵尸态:在UNIX中使用 fork() 系统调用创建进程时,将复制父进程的地址空间。如果父进程调用 wait() 系统调用,那么将暂停父进程的执行,直到子进程终止。在子进程终止时,会生成一个 “SIGCHLD” 信号,该信号会由内核传递给父进程。父进程在收到 “SIGCHLD” 后会从进程表中获得子进程的状态。即使子进程终止了,在进程表中也有一个对应于子进程的条目,该条目存储了状态。当父级收集状态时,该条目将被删除。因此,将从系统中删除子进程的所有痕迹。如果父进程决定不等待子进程终止而执行后续任务,则在子进程终止时,父进程不会读取退出状态。因此,即使在终止子进程之后,进程表中仍会保留一个条目。子进程的这种状态称为僵尸态。
// A C program to demonstrate working of// fork() and process table entries.#include<stdio.h>#include<unistd.h>#include<sys/wai ...
C 中的多进程编程 —— Advanced Operating Systems
Advanced Operating Systems
原文件为 PPT,这里是分页翻译的
目录多进程编程
Fork 进程
进程间同步
执行其他程序
进程间通信
信号
管道和有名管道
消息队列
共享内存
同步
多进程编程为什么要多进程编程
多进程意味着每个任务都有自己的地址空间
与多线程相比,任务隔离和独立性更高
可靠性:一个进程崩溃不会影响整个程序
对于任务对资源有重大要求的多任务应用程序是有用选择
需要“较长”处理时间的任务
处理大数据结构的任务
实例 1 :fork 一个进程#include <stdio.h>#include <sys/types.h>#include <unistd.h> int main () { pid_t child_pid; printf("Main process id = %d (parent PID = %d)\n", (int) getpid(), (int) getppid()); child_pid = fork(); ...
C++ 中的 const 关键字
1. 常量变量const 可用于声明常量变量。常量变量是在初始化后无法更改其值得变量。常量变量必须在声明时进行初始化
const int i = 10;
2. 指向常量的指针指向常量的指针: 指针指向的内容不能被改变。
const int * u; // a pointer point to const intint const * u; // a pointer to an int which is of const type
3. 常指针常指针:指针的指向不能被改变。在可以更改值但不能移动内存的情况下很有用。
int x = 1;int * const w = &x; // a pointer, which is const, that point to an int
4. 指向常量的常指针指向常量的常指针:指针的指向和指向的内容均不能被改变。
int x = 12;const int * const m = &x;
5. 函数的参数为常量传入的参数在函数中不能被改变
void f(const int arg) { ...}
6. 函数 ...
linux_man_zh
1. 安装 man 帮助中文包sudo apt-get install manpages-zh
2. 修改 man 的配置文件man 的配置文件所在路径为 /etc/manpath.config,我这里使用 gedit 来修改配置文件。
sudo gedit /etc/manpath.config
打开配置文件后使用快捷键 ctrl + H 打开替换窗口,然后分别输入 /usr/share/man 和 /usr/share/man/zh_CN,即将 /usr/share/man 替换为 /usr/share/man/zh_CN。然后重新打开一个 terminal 就是使用中文的 man 了。
想要了解更多可以参考 manpages-zh 以及在线文档 Manpages of manpages-zh in Debian unstable
Python 函数中如何实现可变数目的参数
在 python 自定义函数中如何实现可变数量的参数呢?这里有两种种方法来实现。
提供参数默认值
使用关键字参数 kwarg
参数默认值最有用的形式是对一个或多个参数指定一个默认值。这样创建的函数,可以用比定义时允许的更少的参数调用。
比如有打印班级学生信息的一个函数,函数参数包括学生学号、姓名、专业名、班级号和学院名,可以将其中一些信息设置为默认值,例如学院名,这样就可以根据具体情况传递不同数目的参数了。
def student_info(id_num, name, class_name="communication", class_num="1", department="computer"): print('*'*20) print(f'id_num = {id_num}') print(f'name = {name}') print(f'class_name = {clas ...
Linux系统编程——使用 read 和 write 实现拷贝文件
#include <unistd.h>#include <sys/stat.h>#include <sys/types.h>#include <fcntl.h>#include <stdlib.h>#include <stdio.h>#define SIZE 8192int main(int argc, char *argv[]) { char buf[SIZE]; int fd_src, fd_dest, len; if(argc < 3) { printf("usage: ./mycp src dest\n"); exit(1); } fd_src = open(argv[1], O_RDONLY); fd_dest = open(argv[2], O_CREAT | O_WRONLY | O_TRUNC, 0664); while(len = read(fd_src, buf, siz ...
C++ 函数传入不同个数的参量
#include <iostream>#include <cstdarg>void addSum(int count, ...) { va_list args; va_start(args, count); int sum = 0; for(int i = 0; i < count; ++i) { int x = va_arg(args, int); sum += x; } std::cout << "Sum = " << sum << std::endl; va_end(args);}int main() { addSum(3, 4, 4, 2); addSum(5, 7, 8, 3, 2, 0); return 0;}
va_start
va_list
va_end
va_arg
C++ 打印 vector
打印 1D vector方法一: 使用基本 for 循环
#include <iostream>#include <vector>int main() { // initial a vector std::vector<int> arrays{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; for(int i = 0; i < arrays.size(); ++i) { std::cout << arrays[i] << " "; } std::cout << std::endl; return 0;}
方法二: 使用 for each 循环方法
#include <iostream>#include <vector>int main() { // initial a vector std::vector<int& ...