为了账号安全,请及时绑定邮箱和手机立即绑定

作业社区

探索学习新天地,共享知识资源!

0 提交作业
0 布置作业
0 满分作业
得分 100
学习任务

wgf1209 的学生作业:

int main(void) { int fd = open("/dev/video0", O_RDWR); struct v4l2_capability cap = {0}; //存储设备信息的结构体 v4l2_capability. ioctl(fd, VIDIOC_QUERYCAP, &cap); //fd:打开设备返回的文件句柄. //打印结构体成员,也就是设备功能属性值 printf("cap.driver = %s \n", cap.driver); //驱动名,通常是uvcvideo printf("cap.card = %s \n", cap.card); // Device名,厂商定制 printf("cap.bus_info = %s \n", cap.bus_info); //总线信息 printf("cap.version = %d \n", cap.version); //内核版本 printf("cap.capabilities = %x \n", cap.capabilities); //所有能力集 printf("cap.device_caps = %x \n", cap.device_caps); //开放能力集 //printf("cap.reserved = %ls \n", cap.reserved); //保留 //3.检查相机在某种能力下的输出格式,并选择一个适合的格式; struct v4l2_fmtdesc fmt; //存储帧描述信息的结构体. fmt.index = 0; //第0种支持的格式. fmt.type = V4L2_CAP_VIDEO_CAPTURE; //拍照模式下 while (0 == ioctl(fd, VIDIOC_ENUM_FMT, &fmt)) { printf("{ pixelformat = %c%c%c%c }, description = '%s'\n", fmt.pixelformat & 0xff, (fmt.pixelformat >> 8) & 0xff, (fmt.pixelformat >> 16) & 0xff, (fmt.pixelformat >> 24) & 0xff, fmt.description); fmt.index++; } //4.配置相机采集数据的格式 struct v4l2_format format; //帧格式相关参数 format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; //帧为视频帧捕获 format.fmt.pix.width = 640; //像素宽度 format.fmt.pix.height = 480; //像素高度 format.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; //像素格式. format.fmt.pix.field = V4L2_FIELD_INTERLACED; //缓存区像素字段顺序 if (-1 == ioctl(fd, VIDIOC_S_FMT, &format)) { perror("VIDIOC_S_FMT failure!\n"); exit(EXIT_FAILURE); } return 0; } 【图片】

得分 100
讨论题

大禹123 的学生作业:

1、seqstack.h #ifndef __SEQSTACK_H__ #define __SEQSTACK_H__ #include #include #include #define MAX 12 typedef char datatype_t; typedef struct { datatype_t buf[MAX]; //数组存储元素 int top; //栈顶记录数组最后一个元素的下标 }seqstack_t; //1、创建空的顺序栈——为结构体在内存分配空间 extern seqstack_t *create_empty_seqstack(); // 2、入栈 先移动top,再存放数据 extern void push_seqstack(seqstack_t *s, datatype_t data); // 3、出栈 先取数据,再移动top extern datatype_t pop_seqstack(seqstack_t *s); // 4、判断是否为空栈 extern int is_empty_seqstack(seqstack_t *s); // 5、判断是否为满栈 extern int is_full_seqstack(seqstack_t *s); //6、获得栈顶元素的值 extern datatype_t get_top_seqstack(seqstack_t *s); #endif 2、seqstack.c #include "seqstack.h" //1、创建空的顺序栈——为结构体在内存分配空间 seqstack_t *create_empty_seqstack() { seqstack_t *s = NULL; s = (seqstack_t *)malloc(sizeof(seqstack_t)); if(NULL==s){ printf("malloc is failede\n"); return NULL; } memset(s,0,sizeof(seqstack_t)); s->top = -1; return s; } // 2、入栈 先移动top,再存放数据 void push_seqstack(seqstack_t *s, datatype_t data) { s->buf[++s->top] = data; return; } // 3、出栈 先取数据,再移动top datatype_t pop_seqstack(seqstack_t *s) { return s->buf[s->top--]; } // 4、判断是否为空栈 int is_empty_seqstack(seqstack_t *s) { return s->top == -1?1:0; } // 5、判断是否为满栈 int is_full_seqstack(seqstack_t *s) { return s->top == (MAX - 1)?1:0; } //6、获得栈顶元素的值 datatype_t get_top_seqstack(seqstack_t *s) { return s->buf[s->top]; } 3、seqstack.c #include "seqstack.h" int main() { char a[12] = {'a','n','i','h','c',' ','e','v','o','l',' ','I'}; int i=0,ret = 0; seqstack_t *s = NULL; s = create_empty_seqstack(); printf("进栈序列为:\n"); while(!is_full_seqstack(s)){ char temp = a[i++]; push_seqstack(s,temp); printf("%c ",temp); } printf("\n"); printf("出栈序列为:\n"); while(!is_empty_seqstack(s)){ printf("%c ",pop_seqstack(s)); } printf("\n"); return 0; }

得分 100
讨论题

大禹123 的学生作业:

1、looplist.h #ifndef __LOOPLIST__H #define __LOOPLIST__H #include #include #include typedef int datatype_t; typedef struct node{ datatype_t data; struct node *next; }loopnode_t; extern void insert_tail_looplist(loopnode_t *head, datatype_t data); extern loopnode_t *create_node(); extern void Josephu(int n, int k, int m); #endif 2、looplist.c #include "looplist.h" loopnode_t *create_node() { loopnode_t *temp = NULL; temp = (loopnode_t *)malloc(sizeof(loopnode_t)); if(NULL == temp){ printf("malloc is failed\n"); return NULL; } memset(temp,0,sizeof(loopnode_t)); return temp; } void insert_tail_looplist(loopnode_t *head, datatype_t data) { loopnode_t *temp = create_node(); loopnode_t *p = head; //注释,从第一个元素head开始判断,如果.next的值不为NULL 就把下一个元素赋值给p p=p->next 继续循环,直到p为最后一个元素 while(p->next!=head) { p = p->next; } //找到最后一个元素后要注意,第一步一定是先往要插入的元素存原来位置的元素地址(虽然是NULL), temp->next = p->next //第二步才是把要插入的元素地址存储到最后一个元素next上 p->next = temp; temp->data = data; temp->next = p->next; p->next = temp; } void Josephu(int n, int k, int m) { loopnode_t *head = create_node(); loopnode_t *cur_node = NULL; loopnode_t *target_node= NULL; loopnode_t *pre_node = NULL; int total = 0; head->data = 1; head->next = head; cur_node = head; total ++; for(int i=2; inext = cur_node->next; printf("%d ", target_node->data); cur_node = cur_node->next; free(target_node); target_node = NULL; total--; } printf("\n"); } 3、main.c #include "looplist.h" int main() { int n,k,m; printf("请输入[成员数,开始序号,报名数]:\n"); scanf("%d%d%d",&n,&k,&m); Josephu(n, k, m); return 0; }

得分 100
学习任务

邓文兵 的学生作业:

#include #include #include #include #include #include #include #define FIFO_PATH "/tmp/myfifo" #define MAX_EVENTS 10 int main() { int fd, epollfd, n, i; struct epoll_event ev, events[MAX_EVENTS]; char buffer[256]; // 创建有名管道 unlink(FIFO_PATH); // 确保删除已存在的管道 if (mkfifo(FIFO_PATH, 0666) == -1) { perror("mkfifo"); exit(EXIT_FAILURE); } // 打开有名管道进行读取 fd = open(FIFO_PATH, O_RDONLY | O_NONBLOCK); if (fd == -1) { perror("open"); exit(EXIT_FAILURE); } // 初始化epoll实例 epollfd = epoll_create1(0); if (epollfd == -1) { perror("epoll_create1"); exit(EXIT_FAILURE); } // 将有名管道的文件描述符注册到epoll实例 ev.events = EPOLLIN; // 监听可读事件 ev.data.fd = fd; if (epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &ev) == -1) { perror("epoll_ctl"); exit(EXIT_FAILURE); } // 循环等待epoll实例上的事件 while (1) { n = epoll_wait(epollfd, events, MAX_EVENTS, -1); if (n == -1) { perror("epoll_wait"); exit(EXIT_FAILURE); } for (i = 0; i < n; i++) { if (events[i].events & EPOLLIN) { // 读取数据 memset(buffer, 0, sizeof(buffer)); int n = read(events[i].data.fd, buffer, sizeof(buffer) - 1); if (n == -1) { perror("read"); exit(EXIT_FAILURE); } else if (n == 0) { // 管道关闭 break; } // 打印数据 printf("Received: %s\n", buffer); } } } // 关闭文件描述符并删除有名管道 close(fd); unlink(FIFO_PATH); return 0; } 先创建epoll实例,将待检测的文件描述符与回调事件添加到实例当中,然后服务器通过循环检测所有文件描述符,但并非轮询检查,而是阻塞等待事件就绪后导致回调函数触发,此时将就绪好的文件描述符收集返回给用户空间,执行相应的操作。

得分 100
讨论题

weixin_慕哥3021856 的学生作业:

【图片】 函数名:socket 创建一个通信的端点。 概要: #include #include int socket(int domain, int type, int protocol); 函数描述:socket创建一个通信的端点并返回这个端点的文件描述符。成功调用返回的文件描述符,会是进程尚未打开的序号最小的文件描述符。 domain参数指定了一个通信域。选择的协议族将会用来通信。这些协议成员被定义在文件中。目前可理解的格式包括: 【图片】 socket有指定的类型,这些类型规定了通信语义。当前规定的类型有: SOCK_STREAM SOCK_DGRAM SOCK_SEQPACKET SOCK_RAW SOCK_RDM SOCK_PACKET Some socket types may not be implemented by all protocol families. 一些socket类型可能不会被所有的协议族成员实现。 Since Linux 2.6.27, the type argument serves a second purpose: in addition to specifying a socket type, it may include the bitwise OR of any of the following values, to modify the behavior of socket(): 自从Linux 2.6.27版本依赖,类型参数提供了第二个选择:除了说明一个socket类型,它可能包含下列值中的任何一个的位“OR”关系,为了调整socket的行为: SOCK_NONBLOCK Set the O_NONBLOCK file status flag on the new open file description. Using this flag saves extra calls to fcntl(2) to achieve the same result. SOCK_CLOEXEC Set the close-on-exec (FD_CLOEXEC) flag on the new file descriptor. See the description of the O_CLOEXEC flag in open(2) for reasons why this may be useful. 【图片】 这个协议指定了一个特别的协议与socket一起使用。在给定的协议族中,通常只存在单个的协议支持一个特别的socket类型,这种场景下,这个协议被指定为0。然而,多个协议可能都会存在,在这种情况下,必须在其中指定特定的协议方式。对“通信域”来说,要占空间,使用协议号就是明确的。看protocols(5). See getprotoent(3)怎样映射协议名称字符串到协议号。 类型SOCK_STREAM的sockets是全双工传输的字节流。它们不保留记录边界。在它上面任何数据被发送或接收之前,一个流的socket必须处于连接状态。创建与另一个socket的连接要用到一个connect(2)的调用。一旦连接上,使用read(2)和write(2)的调用,数据可能会进行传输,或者使用send(2)和recv(2)的调用产生一些变化。当会话完成时,就会执行关闭。带外数据也可以用send(2)描述的方式进行传输,或者recv(2)描述的那样进行接收。 实现一个SOCK_STREAM的通信协议要确保数据不会丢失或重复。如果对于同一族的协议有缓存空间在一段合理的时间内不能成功地传输一段数据地话,之后这个连接会被认为消亡。当该socket上的SO_KEEPALIVE被激活,协议会以自身特定的方式检查另一端是否还存活。如果一个进程在中断的流中发送或接收,会发出一个SIGPIPE信号;这会导致不处理信号的原始进程退出。SOCK_SEQ‐PACKET套接字使用与SOCK_STREAM套接字相同的系统调用。唯一的区别是read(2)调用将仅返回请求的数据量,到达的数据包中剩余的任何数据都将被丢弃。全部传入数据报中的消息边界也会被保留。 SOCK_DGRAM和SOCK_RAW套接字允许向sendto(2)调用中指定的通讯器发送数据报。数据报通常用recvfrom(2)接收,它返回下一个数据报及其发送者的地址。 SOCK_PACKET是一种过时的套接字类型,用于直接从设备驱动程序接收原始数据包。使用packet(7)代替。 返回值 成功后,将返回新套接字的文件描述符。出现错误时,返回-1,并适当设置errno。错误信息 没有创建指定类型的套接字的权限,协议不可用,标识无效,内存不足等。

微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号