当前位置: 首页 > news >正文

Linux系统编程-DAY12

补充:tcp_fork, tcp_pthread
        1.tcp_fork,父进程只管三次握手,fork()之后要关闭文件描述符,子进程就是给客户端服务的
        2.回收时用sign(SIGCHID, handle)函数

一、数据库
1.sqlite3 mysql mssql
   库--->表--->列--->记录
2.关系型数据库  非关系型数据库(行列组成)
ddl data defination language 建表    
dml  新增 修改 删除一行 data modifty  修改表     
dql  data query language  查询
3.分类:大型:ORACLE(甲骨文)
    中型: MYSQL/MSSQL
    小型:SQLITE(只提供数据的增删改查) DBLL pwdfb  
    关系型数据库
4.名词:
    DB:数据库  select updata database
    DBMS:数据库管理系统
    MIS:管理信息系统
    OA:办公自动化
5.嵌入式数据库:
    sqlite3 
特点:1.开源 C语言开发
    2.代码量少 1万行左右,总大小在10M以内
    3.绿色软件无需安装
    4.文件型数据库,可以移动
    5.数据容量最大2T
whereis sqlite3

二、查状态指令:
    .database  列出当前库和系统中那个文件在关联
    .exit  退出    .quit  退出    
    .headers on | off  打开表头或关闭(默认情况下是关闭的)
    .help   show  this message
    .schema(原理图)  显示建表语句
    .tables  跟ls同理

三、SQL语句:
    1.sql语句必须以 ‘;’结尾

    2.创建一个表:ddl
    create table 表名(表字段1,表字段2, ......);
    eg: create table user(id, name, age);
    ps:以上表的表字段,支持如下数据类型:int text real(小数数据) blob(二进制数据)。 默认是text类型
    create table 表名(表字段1 类型,表字段2 类型, ......);
    eg: create table user(id int , name char , age int);
Ctrl + D :强制退出编译

    3.drop table 表名;

    4.插入:insert into 表名(字段名称)values(值名称);
    eg:insert into user (id, age) values(1, 10);
    
    5.查询表中的数据:
   select 列名 from 表名  条件;
   eg:select * from user ;
       select id from user;
    select id,name from user where not  age <30
       select * from user  where name   like '三_'   % _ 通配符
        eg:SELECT * from cyy where name like '小_';

    and or && ||
    eg: select *from user  where age>20 or age<50 

    6.排序:
    order by 顺序(desc 逆序)
    eg:select * from user order by age desc;(年龄逆序排列)

    7.修改表中的数据:
    update 表名 set 表字段= 值 满足条件;
    eg:update user set id = 3 where name = '没坐' and age = 10;

    8.删除表中数据:
   delete from 表名  满足条件:
   eg:delete from user where id  = 1; ///删除id=1 的数据;

    9.自动增长列
sqlite> CREATE TABLE user3(id INTEGER PRIMARY KEY ASC,name char,age int,dt datetime);  主键 
    eg:insert into user1 values (2,'张三',23,datetime('now','+8 hours'));

四、维护命令
1.数据的导出:
    sqlite3 xxx.db .dump >xxx.sql(> 叫做输出重定向)

2.数据的导入:
    sqlite3 xxx.db <xxx.sql  (<叫做输入重定向)

五、sqlite3 数据库编程接口

1、需要的头文件    sqlite3.h
2、编译过程       -lsqlite3
3、编程框架:
        打开数据库 ---> 读写数据库(增,删,改,查)  ---> 关闭数据库

3.1 打开数据库: sqlite3_open
         int sqlite3_open(char * path,sqlite3 ** db);
         功能:打开指定path路径+文件名称的数据库,并将
         打开的地址指向db变量的句柄。
         参数:path 要打开的数据库路径+名称
         db  要打开的数据库地址指针
3.2 关闭数据库: sqlite3_close
        int sqlite3_close(sqlite3 *db);
        功能:关闭指定的数据库
参数:要关闭的数据库地址
3.3 数据库操作:
        查询操作:sqlite3_get_table();  select 

int sqlite3_get_table(sqlite3 *db,char *sql,
char *** rest,int *nrow,int *ncol,
char ** errmsg);

六、练习与代码
1.tcp_fork() --- 服务端

#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <sys/socket.h>
#include <sys/types.h> /* See NOTES */
#include <time.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>typedef struct sockaddr*(SA);int	main(int argc, char **argv)
{int listfd = socket(AF_INET, SOCK_STREAM, 0);if(-1 == listfd){perror("socket");return 1;}struct sockaddr_in ser, cli;bzero(&ser, sizeof(ser));bzero(&cli, sizeof(cli));ser.sin_family = AF_INET;ser.sin_port = htons(50000);ser.sin_addr.s_addr = inet_addr("192.168.0.119");int ret = bind(listfd, (SA)&ser, sizeof(ser));if (-1 == ret){perror("bind");return 1;}listen(listfd, 3);socklen_t len = sizeof(cli);while(1){int conn = accept(listfd, (SA)&cli, &len);if(-1 == conn){perror("accept");continue;}pid_t pid = fork();if(pid > 0){close(conn);}else if (0 == pid){close(listfd);while(1){char buf[256] = {0};ret = recv(conn, buf, sizeof(buf), 0);if(ret<=0){printf("cli offline\n");close(conn);exit(1);}printf("cli:%s\n",buf);time_t tm;time(&tm);struct tm * info = localtime(&tm);sprintf(buf,"%s %d:%d:%d\n",buf, info->tm_hour,info->tm_min,info->tm_sec);send(conn,buf,strlen(buf),0);}}else{perror("fork");continue;}}close(listfd);return 0;
}

2.tcp_pthread()--- 服务器端

#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <sys/socket.h>
#include <sys/types.h> /* See NOTES */
#include <time.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <pthread.h>typedef struct sockaddr*(SA);void* th(void*arg)
{pthread_detach(pthread_self());//**int conn = *(int*)arg;//sem_post();while(1)    {char buf[256] = {0};int ret = recv(conn, buf, sizeof(buf), 0);if(ret<=0){printf("cli offline\n");close(conn);break;}printf("cli:%s\n",buf);time_t tm;time(&tm);struct tm * info = localtime(&tm);sprintf(buf,"%s %d:%d:%d\n",buf, info->tm_hour,info->tm_min,info->tm_sec);send(conn,buf,strlen(buf),0);}return NULL;
}int	main(int argc, char **argv)
{int listfd = socket(AF_INET, SOCK_STREAM, 0);if(-1 == listfd){perror("socket");return 1;}struct sockaddr_in ser, cli;bzero(&ser, sizeof(ser));bzero(&cli, sizeof(cli));ser.sin_family = AF_INET;ser.sin_port = htons(50000);ser.sin_addr.s_addr = inet_addr("192.168.0.119");int ret = bind(listfd, (SA)&ser, sizeof(ser));if (-1 == ret){perror("bind");return 1;}listen(listfd, 3);socklen_t len = sizeof(cli);while(1){int conn = accept(listfd, (SA)&cli, &len);if(-1 == conn){perror("accept");continue;}pthread_t tid;pthread_create(&tid, NULL, th, &conn);}close(listfd);return 0;
}

3.数据库编程---修改数据库

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sqlite3.h>int	main(int argc, char **argv)
{sqlite3 *db = NULL;int ret = sqlite3_open("./1.db", &db);if(SQLITE_OK != ret){fprintf(stderr, "open %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;}char *errmsg;char sql_cmd[] = "insert into cyy values(7, '牛逼', 85);";ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);if(SQLITE_OK != ret){fprintf(stderr, "exec sql:[%s] errmsg :%s\n", sql_cmd, errmsg);sqlite3_free(errmsg);sqlite3_close(db);return 1;}sqlite3_close(db);return 0;
}

4.数据库编程 --- select数据库

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sqlite3.h>int show(void *args, int col, char **result, char **title)
{int i = 0;static int flag = 0;if(0 == flag){flag = 1;for(i = 0; i < col; ++i){printf("%s\t", title[i]);}printf("\n");}for(i = 0; i < col; ++i){printf("%s\t", result[i]);}printf("\n");return 0;
}int	main(int argc, char **argv)
{sqlite3 *db = NULL;int ret = sqlite3_open("./1.db", &db);if(SQLITE_OK != ret){fprintf(stderr, "open %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;}char *errmsg;char sql_cmd[] = "select * from xiaofan;";ret = sqlite3_exec(db, sql_cmd, show, NULL, &errmsg);if(SQLITE_OK != ret){fprintf(stderr, "exec sql:[%s] errmsg :%s\n", sql_cmd, errmsg);sqlite3_free(errmsg);sqlite3_close(db);return 1;}sqlite3_close(db);return 0;
}

相关文章:

  • Ubuntu下挂载NTFS格式磁盘
  • 延伸大疆AI能力:Coovally一键训练模型,直通无人机部署
  • SALOME源码分析: libBatch
  • [FX5U-PLC] 双重联锁正反转的继电接触控制线路
  • Matlab点云合并函数pcmerge全解析
  • 【算法篇】逐步理解动态规划模型5(子序列问题)
  • 《Playwright:微软的自动化测试工具详解》
  • MySQL学习之---索引
  • 关于类型断言的小细节
  • 【SAP MM SD FICO】销售视图和会计视图
  • 数据库——MongoDB
  • Java判断规则工具类
  • 【杂谈】-递归进化:人工智能的自我改进与监管挑战
  • 60天python训练计划----day50
  • 如何判断Cursor邮箱被封?
  • 《ZLMediaKit 全流程实战:从部署到 API 调用与前后端集成》
  • 【生物信息学】摇摆配对(Wobble Hypothesis)
  • RAG系统向量数据库选型与Prompt Engineering鲁棒性测试实践
  • 人工智能产业融合新时代:路径、挑战与战略思维
  • 从设备监控到人员调度,可视化赋能车间全场景
  • 凡科网做网站花多少钱/站长工具在线免费
  • 新疆5g基站建设/2023年8月新冠疫情
  • 江苏两学一做网站/东莞网络营销代运营
  • 网站优化一般怎么做/如何做网址
  • 做设计赚钱的网站/企业建站 平台
  • 曲阳网站建设在哪/网站友情链接交易平台