循序渐进makefile

Makefile 1

hellomake: hellomake.c hellofunc.c 
     gcc -o hellomake hellomake.c hellofunc.c -I.

如果您将此规则放入名为Makefile或 makefile 的文件中,然后在命令行中键入make,它将执行您在 makefile 中编写的编译命令。请注意,不带参数的make执行文件中的第一条规则。此外,通过将命令所依赖的文件列表放在:之后的第一行,make 知道如果这些文件中的任何一个发生更改,则需要执行规则hellomake。立即,您已经解决了问题 #1,并且可以避免重复使用向上箭头,查找您的最后一个编译命令。但是,该系统在仅编译最新更改方面仍然效率不高。

需要注意的一件非常重要的事情是 makefile 中 gcc 命令之前有一个选项卡。任何命令的开头都必须有一个制表符,如果不存在,make不会高兴。

为了提高效率,让我们尝试以下操作:

Makefile 2

CC=gcc 
CFLAGS=-I。

hellomake: hellomake.o hellofunc.o 
     $(CC) -o hellomake hellomake.o hellofunc.o
......

go语言圣经

入门

I/O包

fmt

var a int
fmt.Scanf("%d", &a)

bufio

scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
	// scanner.Text()
}

读入文件

f := os.Open("filename")
input := bufio.NewScanner(f)
input.Split(bufio.bufio.ScanWords)	//bufio.ScanBytes bufio.ScanLine bufio.ScanRunes

for input.Scan() {
    input.Text()
}

ioutil

data, err := ioutil.ReadFile(filename)
strings.Split(string(data), "\n)

程序结构

......

2socket编程

socket基础

文件操作

int open(const char *path, int flag);

  • flag文件打开模式,如O_CREATE|O_TRUNC|O_RDONLY
    • O_CREATE:必要时创建文件
    • O_TRUNC:删除全部数据
    • O_APPEND
    • O_RDONLY
    • O_WRONLY
    • O_RDWR
  • 成功时返回fd,失败返回-1

int close(int fd);

ssize_t write(int fd, const void *buf, size_t nbytes);

  • buf要传输数据的地址
  • nbytes要传输的字节数

ssize_t read(int fd, void *buf, size_t nbytes);

  • buf要保存接收数据的地址

socket函数及数据类型

#include <sys/socket.h>
int socket(int domain, int type, int protocol);

    ......

3并发服务器

[TOC]

多进程服务器端

处理僵尸进程

#include <sys/wait.h>
pid_t wait(int* statloc);

  • 成功时返回终止的子进程ID,失败时返回-1
  • statloc包含返回信息
  • 使用时通过宏对返回信息进行分离
    • WIFEXITED:if(WIFEXITED(statloc)) /是正常结束的吗?
    • WEXITSTATUS:返回子进程的返回值

pid_t waitpid(pid_t pid, int* statloc, int options);

  • 成功时返回终止的子进程ID,失败时返回-1
  • pid待终止的子进程pid,若传递-1则与wait函数相同,等待任意子进程终止
  • options传递头文件sys/wait.h中声明的常量WNOHANG,即使没有终止的子进程也不会进入阻塞状态,而是返回0并退出函数

信号处理

信号注册

#include <signal.h>
void (*signal(int signo, void (*func)(int)))(int);

    ......

5epoll

[TOC]

epoll系列函数

#include <sys/epoll.h>
int epoll_create(int size);

  • size指epoll实例的大小
  • 成功时返回epoll文件描述符,失败时返回-1

调用epoll_create函数时创建的fd保存空间称为“epoll例程”
通过size参数决定例程的大小,但这只是向操作系统提的“建议”(Linux2.6.8后该参数将被完全忽略)

int epoll_ctl(int epfd, int op, int fd, struct epoll_event* event);

  • epfd用于注册监视对象的epoll例程的fd
  • op用于指定监视对象的添加、删除或更改等操作
    • EPOLL_CTL_ADD将fd注册到epoll例程
    • EPOLL_CTL_DEL从epoll例程中删除fd
    • EPOLL_CTL_MOD更改注册的fd的关注事件发生情况
  • fd需要注册的监视对象的fd
  • event监事对象的事件类型
  • ......
关于我
zinkt
zinkt@foxmail.com
前端基于bootstrap5
后端使用Spring Boot
基于它们构建的一个个人博客系统