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

作业社区

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

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

慕尼黑0001808 的学生作业:

//使用 poll 监听有名管道,当有名管道有数据时,读取数据并打印 #include #include #include #include #include #include #include #define FIFO_NAME "./fifo" int main(void) { int ret,maxfd = 0; struct pollfd pfds; char buffer[64] = {0}; if(mkfifo(FIFO_NAME,0666) == -1){ perror("mkfifo()"); exit(EXIT_FAILURE); } int fd = open(FIFO_NAME,O_RDONLY | O_NONBLOCK); if(-1 == fd){ perror("open()"); exit(EXIT_FAILURE); } pfds.fd = fd; pfds.events = POLLIN; maxfd = pfds.fd; for(;;){ ret = poll(&pfds,1,2000); if (ret == -1){ perror("[ERROR] poll(): "); exit(EXIT_FAILURE); }else if (ret == 0){ printf("Timeout.\n"); }else if (ret > 0){ if (pfds.revents & POLLIN){ //判断返回的就绪事件是否为 POLLIN // 如果是 POLLIN,则表示有用户输入 if(read(fd,buffer,sizeof(buffer)) > 0){ printf("buffer : %s ",buffer); if(strncmp(buffer,"quit",4) == 0){ break; } } } } } close(fd); unlink(FIFO_NAME); return 0; } 运行结果: linux@linux-VMware-Virtual-Platform:~/study/homework/10126$ gcc main.c linux@linux-VMware-Virtual-Platform:~/study/homework/10126$ ./a.out Timeout. Timeout. Timeout. buffer : hello buffer : quit linux@linux-VMware-Virtual-Platform:~/study/homework/10126$ 用户输入 linux@linux-VMware-Virtual-Platform:~/study/homework/10126$ echo "hello" > ./fifo linux@linux-VMware-Virtual-Platform:~/study/homework/10126$ echo "quit" > ./fifo linux@linux-VMware-Virtual-Platform:~/study/homework/10126$

得分 100
学习任务

慕尼黑0001808 的学生作业:

//使用 select 监听有名管道,当有名管道有数据时,读取数据并打印 #include #include #include #include #include #include #include #define FIFO_NAME "./fifo" int main(void) { int ret; int maxfd = 0; fd_set readfds,tmpfds; struct timeval tv = {3,0},tmp_tv; char buffer[64] = {0}; if(-1 == mkfifo(FIFO_NAME,0666)){ perror("mkfifo()"); exit(EXIT_FAILURE); } int fd = open(FIFO_NAME,O_RDONLY|O_NONBLOCK); if(-1 == fd){ perror("open fifo"); exit(EXIT_FAILURE); } FD_ZERO(&readfds); FD_SET(fd,&readfds);// 将标准输入读文件描符合集合中 for(;;){ tmp_tv = tv; tmpfds = readfds; maxfd = fd; ret = select(maxfd + 1,&tmpfds,NULL,NULL,&tmp_tv); if (ret == -1){ perror("[ERROR] select(): "); exit(EXIT_FAILURE); }else if (ret == 0){ // 超时返回 printf("Timeout.\n"); continue; }else if (ret > 0){ if (FD_ISSET(fd,&tmpfds)){ // 判断是否在集合中 if(read(fd,buffer,sizeof(buffer)) > 0){ printf("buffer : %s ",buffer); if(strncmp(buffer,"quit",4) == 0) break; } } } } close(fd); unlink(FIFO_NAME); return 0; } 运行结果: linux@linux-VMware-Virtual-Platform:~/study/homework/10123$ gcc main.c linux@linux-VMware-Virtual-Platform:~/study/homework/10123$ ./a.out Timeout. Timeout. Timeout. Timeout. Timeout. Timeout. Timeout. Timeout. buffer : hello buffer : quit linux@linux-VMware-Virtual-Platform:~/study/homework/10123$ 向管道写数据: linux@linux-VMware-Virtual-Platform:~/study/homework/10123$ echo "hello" > ./fifo linux@linux-VMware-Virtual-Platform:~/study/homework/10123$ echo "quit" > ./fifo linux@linux-VMware-Virtual-Platform:~/study/homework/10123$

得分 100
学习任务

慕尼黑0001808 的学生作业:

//实现多个生产者与多个消费者模型,在示例的基础上进行修改,提示,需要使用 pthread_cond_broadcast 函数唤醒所有阻塞的消费者线程 #include #include #include #include #include static int number = 0;//共享变量 static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; int total_of_produce = 0;//总的生产产品的数量 int total_of_consume = 0;//总的消费产品的数量 bool factory_done = false;//生产是否完成 void *thread_factory(void *arg) { int cnt = atoi((char *)arg); int i,tmp; for(i = 0;i < cnt;i++){ pthread_mutex_lock(&mtx); printf("线程 [%ld] 生产一个产品,产品数量为:%d\n",pthread_self(),++number); pthread_mutex_unlock(&mtx); //pthread_cond_signal(&cond); // 唤醒消费者线程 pthread_cond_broadcast(&cond); } pthread_exit((void *)0); } // 消费线程 void *thread_consume(void *arg) { //bool done = false; for (;;){ pthread_mutex_lock(&mtx); // 当产品数量为 0时,让线程阻塞,并释放锁,这里一般设置循环,防止没有重新获取到锁 while(number == 0 && factory_done == false) { printf("线程 [%ld] pthread_cond_wait 之前..\n",pthread_self()); pthread_cond_wait(&cond,&mtx); printf("线程 [%ld] pthread_cond_wait 之后..\n", pthread_self()); } while(number > 0){ total_of_consume++; // 消费产品总数 printf("线程 [%ld] 消费一个产品,产品剩下库存数量为:%d\n",pthread_self(),--number); //done = total_of_consume >= total_of_produce; // 判断消费者数量与产品数量 } pthread_mutex_unlock(&mtx); // 消费者消费完成之后,释放锁 if (factory_done) break; } pthread_exit((void *)0); } int main(int argc,char *argv[]) { if(argc < 2){ printf("请传入生产列表例:%s 1 2 3\n",argv[0]); } pthread_t tid_factory[argc-1]; pthread_t tid_consume[argc-1]; int i; int err; for (i = 1;i < argc;i++){ total_of_produce += atoi(argv[i]); // 生产数量的总和 err = pthread_create(&tid_factory[i-1],NULL,thread_factory,(void *)argv[i]); if (err != 0){ perror("[ERROR] pthread_create(): "); exit(EXIT_FAILURE); } err = pthread_create(&tid_consume[i-1],NULL,thread_consume,(void *)argv[i]); if (err != 0){ perror("[ERROR] pthread_create(): "); exit(EXIT_FAILURE); } } for(i = 1;i < argc;i++){ pthread_join(tid_factory[i-1],NULL); } factory_done = true; pthread_cond_broadcast(&cond); for(i = 1;i < argc;i++){ pthread_join(tid_consume[i-1],NULL); } printf("一共生产了%d个产品,一共消费了%d个产品\n",total_of_produce,total_of_consume); return 0; } 运行结果: linux@linux-VMware-Virtual-Platform:~/study/homework/10106$ gcc main.c linux@linux-VMware-Virtual-Platform:~/study/homework/10106$ ./a.out 1 2 3 线程 [128696595773120] 生产一个产品,产品数量为:1 线程 [128696587380416] 消费一个产品,产品剩下库存数量为:0 线程 [128696587380416] pthread_cond_wait 之前.. 线程 [128696578987712] 生产一个产品,产品数量为:1 线程 [128696578987712] 生产一个产品,产品数量为:2 线程 [128696587380416] pthread_cond_wait 之后.. 线程 [128696587380416] 消费一个产品,产品剩下库存数量为:1 线程 [128696587380416] 消费一个产品,产品剩下库存数量为:0 线程 [128696587380416] pthread_cond_wait 之前.. 线程 [128696570595008] pthread_cond_wait 之前.. 线程 [128696562202304] 生产一个产品,产品数量为:1 线程 [128696562202304] 生产一个产品,产品数量为:2 线程 [128696562202304] 生产一个产品,产品数量为:3 线程 [128696480429760] 消费一个产品,产品剩下库存数量为:2 线程 [128696480429760] 消费一个产品,产品剩下库存数量为:1 线程 [128696480429760] 消费一个产品,产品剩下库存数量为:0 线程 [128696587380416] pthread_cond_wait 之后.. 线程 [128696570595008] pthread_cond_wait 之后.. 一共生产了6个产品,一共消费了6个产品 linux@linux-VMware-Virtual-Platform:~/study/homework/10106$

得分 100
学习任务

慕尼黑0001808 的学生作业:

//基于互斥锁实现生产者与消费者模型 #include #include #include #include int number = 0; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void *child_thread(void *arg){ int cnt = atoi((char *)arg); for(int i = 0;i < cnt;i++){ pthread_mutex_lock(&mutex); printf("线程[%ld]生产了一个产品,现仓库里面共有%d个产品\n",pthread_self(),++number); pthread_mutex_unlock(&mutex); } pthread_exit((void *)0); } int main(int argc, char *argv[]) { if(2 > argc){ fprintf(stderr,"用法:%s请输入要生产的线程\n",argv[0]); exit(EXIT_FAILURE); } int thread_num = argc -1; int errno = 0; int product_total = 0; int product_dec = 0; pthread_t tid[thread_num]; for(int i = 0;i < thread_num;i++){ product_total += atoi(argv[i+1]); if(0 != (errno = pthread_create(&tid[i],NULL,child_thread,argv[i+1]))){ fprintf(stderr,"pthread_create():%s\n",strerror(errno)); exit(EXIT_FAILURE); } } while(1){ for(int i = 0;i < number;i++){ pthread_mutex_lock(&mutex); product_dec++; printf("线程[%ld]消费一个产品,目前仓库还剩一下%d个产品\n",pthread_self(),--number); pthread_mutex_unlock(&mutex); } if(product_total == product_dec) break; } for(int i = 0;i < thread_num;i++){ pthread_join(tid[i],NULL); } printf("一共生产了%d个产品,一共消费了%d个产品\n",product_total,product_dec); return 0; } 运行结果: linux@linux-VMware-Virtual-Platform:~/study/homework/10104$ gcc main.c linux@linux-VMware-Virtual-Platform:~/study/homework/10104$ ./a.out 3 4 5 线程[127370354751168]生产了一个产品,现仓库里面共有1个产品 线程[127370354751168]生产了一个产品,现仓库里面共有2个产品 线程[127370354751168]生产了一个产品,现仓库里面共有3个产品 线程[127370337965760]生产了一个产品,现仓库里面共有4个产品 线程[127370337965760]生产了一个产品,现仓库里面共有5个产品 线程[127370337965760]生产了一个产品,现仓库里面共有6个产品 线程[127370337965760]生产了一个产品,现仓库里面共有7个产品 线程[127370337965760]生产了一个产品,现仓库里面共有8个产品 线程[127370357360448]消费一个产品,目前仓库还剩一下7个产品 线程[127370357360448]消费一个产品,目前仓库还剩一下6个产品 线程[127370357360448]消费一个产品,目前仓库还剩一下5个产品 线程[127370357360448]消费一个产品,目前仓库还剩一下4个产品 线程[127370357360448]消费一个产品,目前仓库还剩一下3个产品 线程[127370357360448]消费一个产品,目前仓库还剩一下2个产品 线程[127370357360448]消费一个产品,目前仓库还剩一下1个产品 线程[127370357360448]消费一个产品,目前仓库还剩一下0个产品 线程[127370346358464]生产了一个产品,现仓库里面共有1个产品 线程[127370346358464]生产了一个产品,现仓库里面共有2个产品 线程[127370346358464]生产了一个产品,现仓库里面共有3个产品 线程[127370346358464]生产了一个产品,现仓库里面共有4个产品 线程[127370357360448]消费一个产品,目前仓库还剩一下3个产品 线程[127370357360448]消费一个产品,目前仓库还剩一下2个产品 线程[127370357360448]消费一个产品,目前仓库还剩一下1个产品 线程[127370357360448]消费一个产品,目前仓库还剩一下0个产品 一共生产了12个产品,一共消费了12个产品 linux@linux-VMware-Virtual-Platform:~/study/homework/10104$

得分 100
学习任务

学渣小白 的学生作业:

#include #include #include #define debug 1 #define DEBUG_PRINT(…) do { if(debug) printf(VA_ARGS); } while(0) //#define DEBUG_PRINT(…) do { if(debug) {printf("\033[43;31m");printf(VA_ARGS);printf("\033[0m");} } while(0) #define MAX 10 //API接口形式面向对象编码规范 //实际学⽣的存储 struct student { char name[20]; int id; int age; }; typedef struct student datatype_t; typedef struct{ datatype_t buf[MAX]; //定义数组记录班级学⽣每个学⽣的信息。 int n; //学⽣实际到来的个数。 }seqlist_t; seqlist_t * create_empty_seqlist(void ){ seqlist_t * l = (seqlist_t *)malloc(sizeof(seqlist_t)); if(NULL== l){ printf(“malloc error\n”); return NULL; } memset(l,0,sizeof(seqlist_t)); l->n = 0; return l; } int is_full_seqlist(seqlist_t * l){ return l->n==MAX; } void insert_data_seqlist(seqlist_t * l,datatype_t data){ l->buf[l->n] = data; l->n++; // l->data[l->n++] = data; return; } void print_data_seqlist(seqlist_t *l) { for(int i = 0; i < l->n; i++) { printf(“name is: %s\n”, l->buf[i].name); printf(“id is: %d\n”, l->buf[i].id); printf(“age is: %d\n”, l->buf[i].age); printf("-----------------\n"); } } int is_empty_seqlist(seqlist_t *l){ return l->n0?1:0; } int delete_data_seqlist(seqlist_t *l,datatype_t data){ //若为空,不能删除 if (is_empty_seqlist(l)) return -1; int j = 0,i = 0; //删除对饮的数据 for(i=0;in;i++){ if(l->buf[i].id!= data.id){ l->buf[j] = l->buf[i]; j++; } } //更新n的值 l->n = j; //判断删除的元素是否存在 if(ij){ return -2; } else { printf("delete ID:%d is successful!\n", data.id); } return 0; } datatype_t find_students_by_id(seqlist_t *l,int id){ for(int i = 0; i < l->n; i++) { if(l->buf[i].id == id) { return l->buf[i]; } } printf(“ERROR! ID:%d is not exist!\n”, id); exit(-1); } int main(int argc, const char *argv[]){ //DEBUG_PRINT (“Simplified debugging: temp=% d, formula calculation:% d \n”, temp, temp+10); seqlist_t * l = create_empty_seqlist(); datatype_t data; printf("Please input %d students info:\n", MAX); while (!is_full_seqlist(l)){ printf("Please input student info (name id age): "); scanf("%s %d %d", data.name, &data.id, &data.age); // 清除输入缓冲区 while(getchar() != '\n'); insert_data_seqlist(l,data); } print_data_seqlist(l); printf("please input you want to delete student's id:"); int delete_id; scanf("%d",&delete_id); while(getchar() != '\n'); // 清除输入缓冲区 DEBUG_PRINT("delete id is: %d\n", delete_id); delete_data_seqlist(l,find_students_by_id(l,delete_id)); print_data_seqlist(l); free(l); l = NULL; return 0; }

得分 100
学习任务

学渣小白 的学生作业:

#include #include #include #define debug 1 #define DEBUG_PRINT(…) do { if(debug) printf(VA_ARGS); } while(0) //#define DEBUG_PRINT(…) do { if(debug) {printf("\033[43;31m");printf(VA_ARGS);printf("\033[0m");} } while(0) #define MAX 10 //API接口形式面向对象编码规范 //实际学⽣的存储 struct student { char name[20]; int id; int age; }; typedef struct student datatype_t; typedef struct{ datatype_t buf[MAX]; //定义数组记录班级学⽣每个学⽣的信息。 int n; //学⽣实际到来的个数。 }seqlist_t; seqlist_t * create_empty_seqlist(void ){ seqlist_t * l = (seqlist_t *)malloc(sizeof(seqlist_t)); if(NULL== l){ printf(“malloc error\n”); return NULL; } memset(l,0,sizeof(seqlist_t)); l->n = 0; return l; } int is_full_seqlist(seqlist_t * l){ return l->n==MAX; } void insert_data_seqlist(seqlist_t * l,datatype_t data){ l->buf[l->n] = data; l->n++; // l->data[l->n++] = data; return; } void print_data_seqlist(seqlist_t *l) { for(int i = 0; i < l->n; i++) { printf(“name is: %s\n”, l->buf[i].name); printf(“id is: %d\n”, l->buf[i].id); printf(“age is: %d\n”, l->buf[i].age); printf("-----------------\n"); } } int main(int argc, const char *argv[]){ //DEBUG_PRINT (“Simplified debugging: temp=% d, formula calculation:% d \n”, temp, temp+10); seqlist_t * l = create_empty_seqlist(); datatype_t data; printf("Please input %d students info:\n", MAX); while (!is_full_seqlist(l)){ printf("Please input student info (name id age): "); scanf("%s %d %d", data.name, &data.id, &data.age); // 清除输入缓冲区 while(getchar() != '\n'); insert_data_seqlist(l,data); } print_data_seqlist(l); free(l); l = NULL; return 0; }

得分 100
学习任务

枝wenz_fpJNR0 的学生作业:

1 #ifndef _LINKLIST_H_ 2 #define _LINKLIST_H_ 3 4 #include 5 #include 6 #include 7 8 typedef int datatype_t; 9 typedef struct link 10 { 11 datatype_t data; 12 struct link *next; 13 }linknote_t; 14 15 extern linknote_t *create_empty_linklist(); 16 extern void insert_tail_linklist(linknote_t *head,datatype_t data); 17 extern void printf_data_linklist(linknote_t *head); 18 extern void reverse_data_linklist(linknote_t *head); 19 extern void clean_up_linklist(linknote_t *head); 20 #endif 1 #include"linklist.h" 2 //新建空链表函数 3 linknote_t *create_empty_linklist() 4 { 5 linknote_t *head=NULL; 6 //头节点指针域为NULL 7 //为头节点在堆区分配空间,用head指针保存 8 head=(linknote_t *)malloc(sizeof(linknote_t)); 9 if(NULL==head) 10 { 11 printf("malloc is fali!\n"); 12 return NULL; 13 }//判断head指针是否申请空间成功 14 memset(head,0,sizeof(linknote_t)); 15 //初始化head指针 16 return head; 17 } 18 //插入数据函数 19 void insert_tail_linklist(linknote_t *head,datatype_t data) 20 { 21 //用指针temp保存新节点 22 linknote_t *temp=NULL; 23 //为新节点在堆区申请空间 24 temp=(linknote_t *)malloc(sizeof(linknote_t)); 25 //将data数据放入temp节点的数据域 26 temp->data=data; 27 //用指针p循环遍历找到结尾点 28 linknote_t *p=head; 29 while(p->next!=NULL) 30 { 31 p=p->next; 32 } 33 //在p后插入temp节点 34 temp->next=p->next; 35 p->next=temp; 36 return ; 37 } 38 //输出函数 39 void printf_data_linklist(linknote_t *head) 40 { 41 //新建p节点保存head链表 42 linknote_t *p=head; 43 //循环遍历找到结尾点,输出每个节点 44 while(p->next!=NULL) 45 { 46 printf("%d ",p->next->data); 47 p=p->next; 48 } 49 printf("\n"); 50 return ; 51 } 52 //逆序函数 53 void reverse_data_linklist(linknote_t *head) 54 { 55 //新建p q指针并初始化 56 linknote_t *p = NULL; 57 linknote_t *q = NULL; 58 //指针p保存第二个有效节点,并把第一个有效节点 59 //的指针域(即next)设置为NULL 60 p=head->next->next; 61 head->next->next=NULL; 62 //从p节点开始用头插法思想,把p节点插入到头节点后面 63 while(p!=NULL) 64 { 65 q=p->next;//用指针q保存p后面的节点地址 66 //将p节点插入到头节点后面 67 p->next=head->next; 68 head->next=p; 69 p=q; 70 } 71 return ; 72 } 73 //清楚链表 74 void clean_up_linklist(linknote_t *head) 75 { 76 //清楚前一个节点,输出后一个节点的数据 77 linknote_t *p=head;//用指针p保存head链表 78 linknote_t *q=NULL;//创建一个指针q存放删除节点的后一个节点 79 while(p!=NULL) 80 { 81 q=p->next;//指针q保存p的下一个节点 82 printf_data_linklist(p); 83 free(p);//删除p节点 84 p=q; 85 } 86 return ; 87 } 1 #include"linklist.h" 2 3 int main(int argc, const char *argv[]) 4 { 5 //初始化头节点 6 linknote_t *head = NULL; 7 //声明变量n为输入数据数量,i为循环变量,ret为接收返回值 8 int n=0,i=0,ret=0; 9 //声明数据data 10 datatype_t data; 11 //将新建空链表付给head指针 12 head=create_empty_linklist(); 13 14 printf("please input you want inset data number : "); 15 scanf("%d",&n); 16 17 printf("please input %d data:",n); 18 for(i=0;i

得分 100
学习任务

慕工程6300203 的学生作业:

#include #include #include #include #include #include #include #include #include #define PATHNAME "./" #define PROID 66 #define MSG_SIZE 64 struct msgbuf { long mtype; char mtext[MSG_SIZE]; }; int main(int argc, char* argv[]) { pid_t cpid_a, cpid_b; key_t key; int msgid; struct msgbuf rcvmsg; ssize_t rcvsize; key = ftok(PATHNAME, PROID); if (key == -1) { perror("[ERROR] ftok(): "); exit(EXIT_FAILURE); } msgid = msgget(key, IPC_CREAT | 0666); if (msgid == -1) { perror("[ERROR] msgget(): "); exit(EXIT_FAILURE); } cpid_a = fork(); if (cpid_a == -1) { perror("[ERROR] fork(): "); exit(EXIT_FAILURE); } else if (cpid_a == 0) { while (1) { rcvsize = msgrcv(msgid, (void *)&rcvmsg, MSG_SIZE, 100, 0); if (rcvsize == -1) { perror("[ERROR] msgrcv(): "); exit(EXIT_FAILURE); } printf("child A received data : %s\n", rcvmsg.mtext); } } else if (cpid_a > 0) { cpid_b = fork(); if (cpid_b == -1) { perror("[ERROR] fork(): "); exit(EXIT_FAILURE); } else if (cpid_b == 0) { while (1) { rcvsize = msgrcv(msgid, (void *)&rcvmsg, MSG_SIZE, 200, 0); if (rcvsize == -1) { perror("[ERROR] msgrcv(): "); exit(EXIT_FAILURE); } printf("child B received data : %s\n", rcvmsg.mtext); } } else if (cpid_b > 0) { char sndmsg[MSG_SIZE]; long mtype; char *first_part, *remaining; while (1) { fgets(sndmsg, MSG_SIZE, stdin); if (strncmp("quit", sndmsg, 4) == 0) { break; } first_part = strtok(sndmsg, " "); if (first_part != NULL) { // 获取剩余部分(strtok修改了原字符串) remaining = sndmsg + strlen(first_part) + 1; // +1跳过分隔符 } mtype = atol(first_part); struct msgbuf msgbuf; msgbuf.mtype = mtype; strcpy(msgbuf.mtext, remaining); msgsnd(msgid, (void *)&msgbuf, strlen(msgbuf.mtext) + 1, 0); } kill(cpid_a, SIGKILL); kill(cpid_b, SIGKILL); waitpid(cpid_a, NULL, 0); waitpid(cpid_b, NULL, 0); printf("Bye!\n"); exit(EXIT_SUCCESS); } } return 0; }

微信客服

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

帮助反馈 APP下载

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

公众号

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