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;
}