c++ 经典服务器开源项目 Tinywebserver学习笔记


学习中的疑问?
// 创建user表
USE yourdb;
CREATE TABLE user(
username char(50) NULL,
passwd char(50) NULL
)ENGINE=InnoDB;

疑问部分

ENGINE=InnoDB 存储引擎指定为innoDB的作用的意义?

报错部分

fatal error: mysql/mysql.h: No such file or directory?

GOTO

进程结束后还占用大量内存?

在这里插入图片描述
ctrl+C关闭不了 使用命令ps aux查看进程iD 然后kill -9 进行关闭

知识学习和查漏补缺

epoll_create(5) 这个参数有什么作用?
    在最初的 epoll_create() 实现中,大小参数
    通知内核文件描述符的数量
    调用者期望添加到 epoll 实例。 使用的内核
    此信息作为最初空间量的提示
    在描述事件的内部数据结构中分配。 (如果
    必要时,如果调用者的
    使用量超出了大小中给出的提示。)如今,此提示是
    不再需要(内核动态调整所需的大小)
    数据结构而不需要提示),但大小仍然必须是
    大于零,以确保向后兼容性
    新的 epoll 应用程序在旧内核上运行。

    在 Linux 2.6.29 之前, /proc/sys/fs/epoll/max_user_instances
    内核参数限制每个真实用户 ID 的实时 epolls,以及
    导致 epoll_create() 因 EMFILE 溢出而失败。

由上面知道 参数大于0只是为了向前兼容

#、##、__VA_ARGS__的使用

#、##、__VA_ARGS__的使用

信号量sem

Linux线程同步机制四–信号量sem

管道pipe

linux管道pipe详解

下面是项目中封装的 类


class sem
{
public:
/*第一个参数是sem_t结构指针,该结构用于保存信号量的信息。

第二个参数控制信号量的类型,如果参数值为0,表示该信号量是局部的,否则其他程序就能共享这个信号量。

第三个参数是信号量的初始值。
*/
    sem()
    {
        if (sem_init(&m_sem, 0, 0) != 0)
        {
            throw std::exception();
        }
    }
    sem(int num)
    {
        if (sem_init(&m_sem, 0, num) != 0)
        {
            throw std::exception();
        }
    }
    ~sem()
    {
        sem_destroy(&m_sem);
    }
    bool wait()
    {
        return sem_wait(&m_sem) == 0;
    }
    bool post()
    {
        return sem_post(&m_sem) == 0;
    }

private:
    sem_t m_sem;
};

getopt 方法详解和使用示例 用于可执行文件可提供选择 自定义程序运行的方式

C/C++ 命令解析:getopt 方法详解和使用示例
具体代码部分在 config.cpp里面的 parse_arg 用来解析可供选择的运行方式 牛蛙牛蛙


void Config::parse_arg(int argc, char*argv[]){
    int opt;
    const char *str = "p:l:m:o:s:t:c:a:";
    while ((opt = getopt(argc, argv, str)) != -1)
    {
        switch (opt)
        {
        case 'p':
        {
            PORT = atoi(optarg);
            break;
        }
        case 'l':
        {
            LOGWrite = atoi(optarg);
            break;
        }
        case 'm':
        {
            TRIGMode = atoi(optarg);
            break;
        }
        case 'o':
        {
            OPT_LINGER = atoi(optarg);
            break;
        }
        case 's':
        {
            sql_num = atoi(optarg);
            break;
        }
        case 't':
        {
            thread_num = atoi(optarg);
            break;
        }
        case 'c':
        {
            close_log = atoi(optarg);
            break;
        }
        case 'a':
        {
            actor_model = atoi(optarg);
            break;
        }
        default:
            break;
        }
    }
}

模块部分

数据库连接池

liunx数据库常用api

mysql_init()

MYSQL *mysql_init(MYSQL *mysql)


描述

分配或初始化与mysql_real_connect()相适应的MYSQL对象。如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。如果mysql_init()分配了新的对象,当调用mysql_close()来关闭连接时。将释放该对象。


返回值

初始化的MYSQL*句柄。如果无足够内存以分配新的对象,返回NULL。


错误

在内存不足的情况下,返回NULL。

		MYSQL *con = NULL;
		con = mysql_init(con);

		if (con == NULL)
		{
			LOG_ERROR("MySQL Error");
			exit(1);
		}
mysql_real_connect()

链接跳转

mysql_query

链接跳转

mysql_store_result

链接跳转

mysql_num_fields

链接跳转

mysql_fetch_fields

链接跳转

参考资料

MYSQL 实验室

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值