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

作业社区

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

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

胡汉三66 的学生作业:

ex_select_read.c #include #include #include #include #include #include #include #define PATH "./fifo_test" //定义管道文件名 //使用 select 函数监控 有名管道,如果 有名管道有数据时,读取数据并打印 int main(void) { int ret,fd; //int maxfd;//定义 最大的文件描述符 变量 fd_set readfd;//定义 文件描述符集合 变量 fd_set readfd_tmp; struct timeval tm = {3,0};//设置超时时间为3秒. struct timeval tm_tmp; char buffer[64] = {0}; ssize_t rbytes; ret = mkfifo(PATH,0644);//创建有名管道 if (ret == -1) { perror("[ERROR] mkfifo() :\n"); exit(EXIT_FAILURE); } fd = open(PATH,O_RDONLY);//以只读方式打开管道文件,返回文件描述符 if (fd == -1) { perror("[ERROR] open ():\n"); exit(EXIT_FAILURE); } FD_ZERO(&readfd);//文件描述符集合 初始化 FD_SET(fd,&readfd);//添加 文件描述符 到集合中."fd" 为 管道文件 文件描述符 FD_ZERO(&readfd_tmp);//文件描述符集合 初始化 for(;;) { tm_tmp = tm;//赋值超时时间3秒 给 tm_tmp 变量,因为时间超时后,内核会把 超时时间 清零. readfd_tmp = readfd;//赋值 标准输入文件描述符 给 readfd_tmp 变量,因为时间超时后,内核会把 文件描述符集合 清空. ret = select(fd + 1,&readfd_tmp,NULL,NULL,&tm_tmp);//检查是否有可读数据,并返回 if (ret == -1) { perror("[ERROR] select () :\n"); close(fd); exit(EXIT_FAILURE);//失败退出 }else if(ret == 0)//超时退出 { printf("TIMEOUT!\n"); }else if(ret > 0)//有就绪的文件描述符 { if (FD_ISSET(fd,&readfd_tmp)) { rbytes = read(fd,buffer,64);//读取管道文件中的数据,保存在数组buffer中 if(rbytes == -1) { perror("[ERROR] read () :\n"); close(fd); exit(EXIT_FAILURE); } printf("buffer : %s\n",buffer); } } } close(fd);//关闭文件描述符 return 0; } ex_write.c #include #include #include #include #include #include #define PATH "./fifo_test" //定义管道文件名 //循环 输入数据 到 管道文件 中 int main(void) { int fd; ssize_t wbytes;//定义实际写入的字节数 char buffer[64] = {0}; fd = open(PATH,O_WRONLY);//以 只写方式 打开 管道文件,并返回文件描述符 if (fd == -1) { perror("[ERROE] open() :\n"); exit(EXIT_FAILURE); } for(;;) { fgets(buffer,sizeof(buffer),stdin);//从标准输入 获取 一行数据,保存在buffer中 wbytes = write(fd,buffer,64);//将数组buffer中的数据 写入 管道文件 中 if (wbytes == -1) { perror("[ERROR] write() :\n"); close(fd); exit(EXIT_FAILURE); } } close(fd);//关闭文件描述符 return 0; } 输入端【图片】 读取端【图片】

得分 100
学习任务

向佐佐 的学生作业:

准备一个传输源文件sour.txt,并在其中输入一段文字【图片】 用一个进程将源文件读取到共享内存: #include #include #include #include #include #include #define PATHNAME "." #define PROJ_ID 88 #define SHM_SIZE 1024 int main(void) { //定义一些结果变量 FILE *sour = NULL; key_t key; int shmid; void *addr = NULL; size_t read_to_shm; //打开准备好的源文件 sour = fopen("./sour.txt","r"); if(sour == NULL) { perror("[ERROR]fopen():"); exit(EXIT_FAILURE); } //生成key并创建共享内存 key = ftok(PATHNAME,PROJ_ID); if(key == -1) { perror("[ERROR]ftok():"); exit(EXIT_FAILURE); } shmid = shmget(key,SHM_SIZE,IPC_CREAT | 0644); if(shmid == -1) { perror("[ERROR]shmget():"); exit(EXIT_FAILURE); } //共享内存映射 addr = shmat(shmid,NULL,0); if(addr == (void *)-1) { perror("[ERROR]shmat():"); exit(EXIT_FAILURE); } //源文件内容读取到共享内存 read_to_shm = fread(addr,sizeof(char),SHM_SIZE/sizeof(char),sour); printf("%ld chars read to shm\n",read_to_shm); //解除映射,关闭源文件 shmdt(addr); fclose(sour); return 0; } 【图片】 用另一个进程将共享内存中的数据写入目标文件dest.txt: #include #include #include #include #include #include #include #define PATHNAME "." #define PROJ_ID 88 #define SHM_SIZE 1024 int main(void) { //定义一些结果变量 FILE *dest = NULL; key_t key; int shmid; void *addr = NULL; size_t write_from_shm; size_t shm_char_size; int ret; //创建目标文件 dest = fopen("./dest.txt","w+"); if(dest == NULL) { perror("[ERROR]fopen():"); exit(EXIT_FAILURE); } //生成key并创建共享内存 key = ftok(PATHNAME,PROJ_ID); if(key == -1) { perror("[ERROR]ftok():"); exit(EXIT_FAILURE); } shmid = shmget(key,SHM_SIZE,IPC_CREAT | 0644); if(shmid == -1) { perror("[ERROR]shmget():"); exit(EXIT_FAILURE); } //共享内存映射 addr = shmat(shmid,NULL,0); if(addr == (void *)-1) { perror("[ERROR]shmat():"); exit(EXIT_FAILURE); } //获取共享内存中写入的字节数 shm_char_size = strlen(addr); //共享内容写入到目标文件 write_from_shm = fwrite(addr,sizeof(char),shm_char_size,dest); printf("%ld chars write to dest\n",write_from_shm); //解除映射,关闭目标文件 shmdt(addr); fclose(dest); //删除共享内存 ret = shmctl(shmid,IPC_RMID,NULL); if(ret == -1) { perror("[ERROR]shmctl():"); exit(EXIT_FAILURE); } return 0; } 【图片】 目标文件中的内容如下,与源文件一致【图片】

得分 100
学习任务

大禹123 的学生作业:

#include #include #include #include #include #include #include #include //发送数据一般用strlen,因为发送的时候知道要发送多少个,接收的时候用缓冲区接收,因为不知道接收多少个 void send_data(int sockfd, const struct sockaddr_in *peer_addr, int len, const char *path) { int ret; int rbytes = 0; char buffer[1024] = {0}; FILE *fp = fopen(path, "r"); if(NULL == fp) { perror("[Error] fopen()"); exit(EXIT_FAILURE); } while(1) { memset(buffer, 0, sizeof(buffer)); rbytes = fread(buffer, sizeof(buffer[0]), sizeof(buffer)/sizeof(buffer[0]),fp); if(rbytes == 0) { fclose(fp); printf("send end!\n"); exit(EXIT_FAILURE); } ret = sendto(sockfd, (const void *)buffer, strlen(buffer), 0, (const struct sockaddr *)peer_addr, len); if(ret == -1) { perror("[ERROR] sendto():"); exit(EXIT_FAILURE); } } } //./a.out ip port log.txt int main(int argc, char const *argv[]) { int sockfd; ssize_t ret; struct sockaddr_in peer_addr; int len = sizeof(peer_addr); if(argc!=4) { fprintf(stderr, "Usage: %s pathname ip port\n", argv[0]); exit(EXIT_FAILURE); } //1、通过socket创建文件描述符 sockfd = socket(AF_INET, SOCK_DGRAM, 0); if(sockfd == -1) { perror("[ERROR] socket():"); exit(EXIT_FAILURE); } //2、填充接收方的ip和端口号 memset(&peer_addr, 0, sizeof(peer_addr)); //地址族 peer_addr.sin_family = AF_INET; peer_addr.sin_port = htons(atoi(argv[2])); peer_addr.sin_addr.s_addr = inet_addr(argv[1]); //3、发送数据 send_data(sockfd, &peer_addr, len, argv[3]); //4、关闭文件描述符 close(sockfd); return 0; }

得分 100
学习任务

胡汉三66 的学生作业:

#include #include #include #include #include #include //实现多个生产者(子线程)+多个消费者(子线程)模型,并解决代码中线程资源的释放 //"./a.out 1 2 3 1 2 3":前三个是生产线程,共生产6个产品.后3个是消费线程,共消费6个产品 //释放资源方法,一是分离子线程用pthread_detach()函数,二是等待子线程结束,用pthread_join()函数.有详细代码标记 static int number;//共享资源,记录总共生产的产品 static int control_to_consume = 0;//定义总共消费的产品数 static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;//互斥锁,静态初始化 static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;//条件变量,静态初始化 //子线程,生产者 void *thread_handler_produce(void *arg) { int i = 0; int cns = atoi((char*)arg);//将字符串参数 转变为 整数 for(i = 0;i < cns;i++) { pthread_mutex_lock(&mtx);//获得互斥锁 printf("生产子线程 生产 一个产品,现在有 %d 个产品\n",pthread_self(),++number); sleep(1); pthread_mutex_unlock(&mtx);//释放互斥锁 pthread_cond_broadcast(&cond);//发送 条件变量信号 唤醒所有阻塞 消费子线程,消费子线程 执行不同的任务 } pthread_exit((void *)0); } //子线程,消费者 void *thread_handler_consume(void *arg) { int i = 0; int cns = atoi((char*)arg);//将字符串参数 转变为 整数 pthread_mutex_lock(&mtx);//获得互斥锁 while(number == 0)// 仓库没有产品, 阻塞函数.while()函数,是 应对 可能的 多个消费线程时. { pthread_cond_wait(&cond,&mtx);//1.互斥锁解锁 2.阻塞函数 3.等待 条件变量信号 唤醒函数 4.唤醒后,重新竞争互斥锁 } for(i = 0;i < cns && number > 0;i++) { control_to_consume++;//消费一个产品 printf("消费子线程 消费 一个产品,现在有 %d 个产品\n",pthread_self(),--number); sleep(1); } if(number > 0) { pthread_cond_broadcast(&cond); //唤醒其他可能在等待的消费者 } pthread_mutex_unlock(&mtx);//释放互斥锁 pthread_exit((void *)0); } //主函数 int main(int argc,char *argv[]) { pthread_t tid[argc]; int err,i = 0; bool done; int control_to_produce = 0;//定义总共生产的产品数 if (argc != 7) { fprintf(stderr,"Usage : < %s > ",argv[0]); exit(EXIT_FAILURE); } //创建 生产者 线程 for(i = 1;i < (argc - 3);i++) { control_to_produce += atoi((char *)argv[i]);//统计总共生产的产品 err = pthread_create(&tid[i],NULL,thread_handler_produce,(void *)argv[i]);//创建子线程 if (err != 0) { fprintf(stderr,"[ERROR] pthread_create ():\n",strerror(err)); exit(EXIT_FAILURE); } printf("创建 生产者 线程 \n",tid[i]); pthread_detach(tid[i]);//使子线程分离,等线程结束后,操作系统自动回收资源 } //创建 消费者 线程 for(i = (argc - 3);i < argc;i++) { err = pthread_create(&tid[i],NULL,thread_handler_consume,(void *)argv[i]);//创建子线程 if (err != 0) { fprintf(stderr,"[ERROR] pthread_create ():\n",strerror(err)); exit(EXIT_FAILURE); } printf("创建 消费者 线程 \n",tid[i]); pthread_detach(tid[i]);//使子线程分离,等线程结束后,操作系统自动回收资源 } //判断程序是否结束 for(;;) { if(control_to_consume >= control_to_produce) //判断 总消费数 是否大于等于 总生产数 { break; } } return 0; } 【图片】

微信客服

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

帮助反馈 APP下载

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

公众号

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