2024.5.23 作业 xyt

发布于:2024-05-23 ⋅ 阅读:(34) ⋅ 点赞:(0)

今日课堂内容:超时检测 数据库

select函数

#include <myhead.h>
int main(int argc, const char *argv[])
{
	    //1、定义检测容器
    fd_set readfds;

    //2、清空内容
    FD_ZERO(&readfds);

    //3、将文件描述符放入集合中
    FD_SET(0, &readfds);

    //4、定义超时时间变量
    struct timeval tv = {5, 0};

    while(1)
    {
        tv.tv_sec = 5;
        tv.tv_usec = 0;

        int res = select(1, &readfds, NULL, NULL, &tv);
        if(res == -1)
        {
            perror("select error");
            return -1;
        }else if(res == 0)
        {
            printf("time out\n");
            return -1;
        }

        //判断
        if(FD_ISSET(0, &readfds))
        {
            int num = 0;
            scanf("%d", &num);
            printf("触发键盘输入:%d\n", num);
        }
    }
	return 0;
}

poll函数

#include <myhead.h>
int main(int argc, const char *argv[])
{
	    //1、定义文件描述符集合
    struct pollfd pfd;

    pfd.fd = 0;        //表示检测的是0号文件描述符
    pfd.events = POLLIN;      //表示检测读事件

    //2、调用函数
    while(1)
    {
        int res = poll(&pfd, 1, 5000);
        if(res == -1)
        {
            perror("poll error");
            return -1;
        }else if(res == 0)
        {
            printf("time out\n");
            return -1;
        }

        //判断
        if(pfd.revents == POLLIN)
        {
            int num = 0;
            scanf("%d", &num);
            printf("触发键盘输入:%d\n", num);
        }

    }
	return 0;
}

通过信号完成时间的设置

#include <myhead.h>
//定义信号处理函数
void handler(int signo)
{
    if(signo == SIGALRM)
    {
        printf("系统已经随机为您出一张牌\n");

        alarm(5);
    }
}

int main(int argc, const char *argv[])
{
	    char ch;        //用户选择的牌

    //将SIGALRM信号捕获到自定义函数中
    if(signal(SIGALRM, handler) == SIG_ERR)
    {
        perror("signal error");
        return -1;
    }

    while(1)
    {
        alarm(5);          //给出5秒考虑时间
        printf("请出牌>>>");
        scanf("%c", &ch);
        getchar();

        printf("您出的牌为:%c\n", ch);
    }
	return 0;
}

数据库

#include <myhead.h>
int main(int argc, const char *argv[])
{
	//1、创建或打开一个数据库
	sqlite3 *ppDb = NULL;
	if(sqlite3_open("my.db", &ppDb) != SQLITE_OK)
	{
		printf("open error:%d, %s\n", sqlite3_errcode(ppDb),sqlite3_errmsg(ppDb));
		return -1;
	}
	printf("数据库已经打开\n");

	//2、关闭数据库
	sqlite3_close(ppDb);
	return 0;
}

今日课堂提问:

1.IO多路复用的原理?
答:定义一个文件描述符集合,阻塞等待集合中是否有事件产生,如果有事件产生,则执行对于的函数

2.实现IO多路复用可以使用哪些函数完成?
答:select、 poll、epoll

3.select和poll的区别?
答:select是检测不同的文件描述符集合,包括读、写、异常文件描述符集合;poll将检测的文件描述符放入一个文件描述符结构体数组中。
有关超时参数,select是地址传递而pol1是值传递;
select在检测文件描述符集合大小有限制,而poll没有

4.在UDP通信过程中,能否使用connect函数?为什么?有什么好处?
答:可以使用,可以跟指定的端点建立唯一的通道,在通信过程中,不受其他端点的影响

5.OSI7层网络体系结构有哪些?
答:物理、数据链路层、网络层、传输层、会话层、表示层、应用层

6.四层网络体系结构?
答:应用层、传输层、网络层、网络接口层

7.ARP、HTTP、TFTP、IP、UDP、TCP说出全程和所在层?
答:arp地址解析协议,网络接口层
http超文本传输协议,应用层
IP网际协议,网络层
udp用户数据报协议,传输层tcp传输控制协议,传输层

8.100.0.125.2对于的默认子网掩码是多少?
答:255.0.0.0

9.顺序表和链表的区别?
答:顺序表类似于数组,特点是逻辑上连续物理地址也连续;链表是逻辑上连续的数据元素,物理地址上不一定连续;顺序表存储数据有上限,链表没有

10.进程和线程的区别?
答:线程是进程的最小执行单元、进程之间用户空间是相互独立的、多个线程共享同一个进程的资源、