#include <myhead.h>
int do_add(sqlite3 *ppDb)
{
int add_numb = 0;
char add_name[20] = {0};
double add_score = 0;
printf("请输入学号:");
scanf("%d",&add_numb);
printf("请输入姓名:");
scanf("%s",add_name);
printf("请输入成绩:");
scanf("%lf",&add_score);
getchar();
char sql[128] = {0};
sprintf(sql,"insert into Stu values(%d,\"%s\",%lf);",add_numb,add_name,add_score);
char *errmsg =NULL;
if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
printf("exec error:%s\n",errmsg);
sqlite3_free(errmsg);
return -1;
}
printf("插入成功\n");
return 0;
}
int do_del(sqlite3 *ppDb)
{
int del_numb = 0;
char del_name[20] = {0};
double del_score = 0;
int choose = -1;
printf("请输入你想删除的字段:\n1.学号\n2.姓名\n3.成绩\n");
scanf("%d",&choose);
getchar();
char sql[128] = {0};
switch(choose)
{
case 1:
{
printf("请输入您的学号:");
scanf("%d",&del_numb);
getchar();
sprintf(sql,"delete from Stu where del_numb == %d;",del_numb);
break;
}
case 2:
{
printf("请输入您的姓名:");
scanf("%s",del_name);
getchar();
sprintf(sql,"delete from Stu where del_name == \"%s\";",del_name);
break;
}
case 3:
{
printf("请输入您的成绩:");
scanf("%lf",&del_score);
getchar();
sprintf(sql,"delete from Stu where del_score == %lf;",del_score);
break;
}
default:
{
printf("输入错误,请重新输入\n");
}
}
char *errmsg =NULL;
if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
printf("exec error:%s\n",errmsg);
sqlite3_free(errmsg);
return -1;
}
printf("删除成功\n");
return 0;
}
int do_update(sqlite3 *ppDb)
{
int update_numb = 0;
char update_name[20] = {0};
double update_score = 0;
int choose = -1;
int choose1 = -1;
printf("请输入您想要修改的信息:\n1.学号\n2.姓名\n3.成绩\n");
scanf("%d",&choose);
getchar();
char sql[128] = {0};
switch(choose)
{
case 1:
{
printf("请输入您的学号:");
scanf("%d",&update_numb);
getchar();
printf("请输入您想要限制的条件:\n1.姓名\n2.成绩\n");
scanf("%d",&choose1);
getchar();
switch(choose1)
{
case 1:
{
printf("请输入您的姓名:");
scanf("%s",update_name);
getchar();
sprintf(sql,"update Stu set update_numb = %d where update_name == \"%s\";",update_numb,update_name);
break;
}
case 2:
{
printf("请输入您的成绩:");
scanf("%lf",&update_score);
getchar();
sprintf(sql,"update Stu set update_numb = %d where update_score == %lf;",update_numb,update_score);
break;
}
default:
{
printf("输入错误,请重新输入\n");
}
}
}
case 2:
{
printf("请输入您的姓名:");
scanf("%s",update_name);
getchar();
printf("请输入您想要限制的条件:\n1.学号\n2.成绩\n");
scanf("%d",&choose1);
getchar();
switch(choose1)
{
case 1:
{
printf("请输入您的学号:");
scanf("%d",&update_numb);
getchar();
sprintf(sql,"update Stu set update_name = \"%s\" where update_numb == %d;",update_name,update_numb);
break;
}
case 2:
{
printf("请输入您的成绩:");
scanf("%lf",&update_score);
getchar();
sprintf(sql,"update Stu set update_name = \"%s\" where update_score == %lf;",update_name,update_score);
break;
}
default:
{
printf("输入错误,请重新输入\n");
}
}
}
case 3:
{
printf("请输入您的成绩:");
scanf("%lf",&update_score);
getchar();
printf("请输入您想要限制的条件:\n1.学号\n2.姓名\n");
scanf("%d",&choose1);
getchar();
switch(choose1)
{
case 1:
{
printf("请输入您的学号:");
scanf("%d",&update_numb);
getchar();
sprintf(sql,"update Stu set update_score = %lf where update_numb == %d;",update_score,update_numb);
break;
}
case 2:
{
printf("请输入您的姓名:");
scanf("%s",update_name);
getchar();
sprintf(sql,"update Stu set update_score = %lf where update_name == \"%s\";",update_score,update_name);
break;
}
default:
{
printf("输入错误,请重新输入\n");
}
}
}
}
char *errmsg =NULL;
if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
printf("exec error:%s\n",errmsg);
sqlite3_free(errmsg);
return -1;
}
printf("修改成功\n");
return 0;
}
int callback(void *arg,int cols,char **msgText,char **msgHeader)
{
if(*((int *)arg) == 0)
{
for(int i = 0;i<cols;i++)
{
printf("%s\t",*(msgHeader+i));
}
printf("\n");
(*((int *)arg)) = 1;
}
for(int i = 0;i<cols;i++)
{
printf("%s\t",*(msgText+i));
}
printf("\n");
return 0;
}
int do_search(sqlite3 *ppDb)
{
char sql[128] = "select * from Stu;";
char *errmsg = NULL;
int flag = 0;
if(sqlite3_exec(ppDb,sql,callback,&flag,&errmsg) != SQLITE_OK)
{
printf("exec error:%s\n",errmsg);
sqlite3_free(errmsg);
return -1;
}
return 0;
}
int do_search_1(sqlite3 *ppDb)
{
char sql[128] = "select * from Stu;";
char *errmsg = NULL;
char **res = NULL;
int rows = 0;
int cols = 0;
if(sqlite3_get_table(ppDb,sql,&res,&rows,&cols,&errmsg) != SQLITE_OK)
{
printf("get table error:%s\n",errmsg);
sqlite3_free(errmsg);
return -1;
}
for(int i = 0;i<rows;i++)
{
for(int j = 0;j<cols;j++)
{
printf("%s\t",*(res+(i*cols)+j));
}
printf("\n");
}
sqlite3_free_table(res);
return 0;
}
int main(int argc, const char *argv[])
{
sqlite3 *ppDb = NULL;
if(sqlite3_open("./my.db",&ppDb) != SQLITE_OK)
{
fprintf(stderr,"sqlite3_open error:errmsg = %s,errcode = %d\n",sqlite3_errmsg(ppDb),sqlite3_errcode(ppDb));
return -1;
}
printf("sqlite3_open success\n");
char sql[128] = "create table if not exists Stu(numb int,name char,score double);";
char *errmsg = NULL;
if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
printf("exec error:%s\n",errmsg);
sqlite3_free(errmsg);
return -1;
}
printf("create table Stu success\n");
int menu = -1;
while(1)
{
system("clear");
printf("\t\t==========XXX学生管理系统==========\n");
printf("\t\t==========1、添加学生信息==========\n");
printf("\t\t==========2、删除学生信息==========\n");
printf("\t\t==========3、修改学生信息==========\n");
printf("\t\t==========4、查找学生信息==========\n");
printf("\t\t==========0、退出学生信息==========\n");
printf("请输入功能:");
scanf("%d",&menu);
getchar();
switch(menu)
{
case 1:
{
do_add(ppDb);
}
break;
case 2:
{
do_del(ppDb);
}
break;
case 3:
{
do_update(ppDb);
}
break;
case 4:
{
do_search(ppDb);
//do_search_1(ppDb);
}
break;
case 0:goto END;
default:printf("您输入的功能有误,请重新输入\n");
}
printf("请输入任意键回车后清屏\n");
while(getchar()!='\n');
}
END:
sqlite3_close(ppDb);
return 0;
}
1.IO多路复用的原理
IO多路复用的原理是利用操作系统提供的机制,通过一个线程或进程同时监听多个IO事件,实现对这些事件的管理和处理。常见的IO多路复用技术包括select、poll、epoll等。它们的基本原理是通过一个系统调用来监听多个文件描述符,一旦有IO事件发生,就通知应用程序进行相应的处理,从而提高IO效率和系统性能
2.实现IO多路复用的方式
1. 使用select函数:在C语言中,可以使用select函数实现IO多路复用,通过监视多个文件描述符的状态变化来进行IO操作。
2. 使用poll函数:类似于select,poll函数也可以用于实现IO多路复用,但在某些情况下性能更好。
select在文件描述符较多时性能会下降,因为每次调用select都需要线性扫描所有文件描述符;而poll使用链表结构存储文件描述符,性能相对较好。
select有一个固定的文件描述符数量限制,通常为1024,而poll没有这个限制。
3.数据库操作对应的函数有哪些
sqlite3_open:打开一个数据库,如果数据库不存在,则创建一个数据库
sqlite3_close:关闭数据库,断开句柄所拥有的资源
sqlite3_exec:调用该函数,执行sql语句,即该函数的第二个参数
4.什么是僵尸进程
僵尸进程是指已经完成执行任务但其父进程尚未调用wait()或waitpid()来获取其退出状态的进程。这些进程会占用系统资源,但不再执行任何操作。僵尸进程的存在通常是由于父进程没有正确处理子进程的退出状态引起的。
5.什么是孤儿进程
孤儿进程是指其父进程已经终止或不存在,而导致操作系统接管并管理该进程的状态和资源。
6.什么是I0
I0通常指的是输入和输出,用于描述计算机系统中与外部设备进行数据交换的过程。
7.IO的分类
文件IO和标准IO
8.文件IO依赖的函数谁提供,标准IO依赖的函数谁提供
文件IO由LINUX内核提供,标准IO由c语言库提供
9.消息队列和共享内存的区别
消息队列是一种通信机制,用于在不同进程之间传递消息,消息存储在队列中,进程可以异步地发送和接收消息。
共享内存是一种进程间通信的方式,允许多个进程访问同一块内存区域,进程可以直接读写这块内存,实现数据共享
10.什么是野指针,以及野指针的产生情况
野指针是指指向未知内存地址的指针,通常是指针未被正确初始化或者指向已释放的内存。
野指针的产生情况包括:指针未初始化、指针指向已释放的内存、指针超出作用域后未置空等。