NUAA 南航操作系统实验 代码部分
文章目录
- 1.myecho
- 2.mycat
- 3.mycp
- 4.mysys
- 5.sh1
- 6.sh2
- 7.sh3
- 8.pi1
- 9.pi2
- 10.sort
- 11.pc1
- 12.pc2
1.myecho
#include<stdlib.h>
#include<stdio.h>
int main(int argc,char *argv[])
{if(argc==1){printf("Error!\n");exit(0);}for(int i=1;i<argc;i++)printf("%s ",argv[i]);printf("\n");return 0;
}
2.mycat
#include<stdio.h>
#include<stdlib.h>int main(int argc,char *argv[]){FILE *fp;int fsize;char *buffer;if(argc!=2){printf("Error!\n");exit(0);}fp=fopen(argv[1],"r");if(!fp){printf("Error!\n");exit(0);}fseek(fp,0,SEEK_END);fsize=ftell(fp);rewind(fp);buffer=(char*)malloc((1+fsize)*sizeof(char));if(!buffer){printf("Error!\n");exit(0);}fread(buffer,1,fsize,fp);printf("%s\n",buffer);fclose(fp);free(buffer);return 0;}
3.mycp
#include<stdio.h>
#include<stdlib.h>int main(int argc,char *argv[]){FILE *fp;int fsize;int fr;char *buffer;if(argc!=3){printf("Error:wrong parameter...\n");return 0;}fp=fopen(argv[1],"r");if(!fp){printf("Error:can't open the file!\n");exit(0);}fseek(fp,0,SEEK_END);fsize=ftell(fp);rewind(fp);buffer=(char *)malloc((1+fsize)*sizeof(char));if(!buffer){printf("Error:memory wrong!\n");exit(0);}fr=fread(buffer,1,fsize,fp);if(!fr){printf("Error:read wrong!\n");exit(0);}fclose(fp);fp=fopen(argv[2],"w");if(!fp){printf("Error:open file wrong!\n");exit(0);}fwrite(buffer,1,fsize,fp);fclose(fp);free(buffer);return 0;}
4.mysys
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <linux/string.h>void mysys(char *command)
{char c[100];strcpy(c,command);pid_t pid;pid=fork();char *argv[10];int i = 0;char *s;if(pid == 0){//printf("start1\n");s= strtok(c," ");//printf("start2\n");argv[i] = s;while(s != NULL){i++;s= strtok(NULL," ");argv[i] = s;}argv[i] = NULL;//for(int j=0;j<i;j++)//{// printf("s = %s\n",argv[j]);//}int error = execvp(argv[0],argv);if(error < 0)perror("execvp");printf("end\n"); }wait(NULL);//return 0;
}int main()
{printf("--------------------------------------------------\n");mysys("echo HELLO WORLD");printf("--------------------------------------------------\n");mysys("ls /");printf("--------------------------------------------------\n");return 0;
}
5.sh1
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <linux/string.h>void mysys(char *command)
{char c[100];strcpy(c,command);pid_t pid;pid=fork();char *argv[10];int i = 0;char *s;if(pid == 0){//printf("start1\n");s= strtok(c," ");//printf("start2\n");argv[i] = s;while(s != NULL){i++;s= strtok(NULL," ");argv[i] = s;}argv[i] = NULL;//for(int j=0;j<i;j++)//{// printf("s = %s\n",argv[j]);//}int error = execvp(argv[0],argv);if(error < 0)perror("execvp");printf("end\n"); }wait(NULL);//return 0;
}
int main()
{printf("> ");char command[100];fgets(command,100,stdin);mysys(command);return 0;
}
6.sh2
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <linux/string.h>
#include <fcntl.h>void mysys(char *cmd1,char *cmd2)
{char c[100];strcpy(c,cmd1);pid_t pid;pid=fork();char *argv[10];int i = 0;char *s;if(pid == 0){//printf("start1\n");s= strtok(c," ");//printf("start2\n");argv[i] = s;while(s != NULL){i++;s= strtok(NULL," ");argv[i] = s;}argv[i] = NULL;//for(int j=0;j<i;j++)//{// printf("s = %s\n",argv[j]);//}int =sizeof(cmd2);char filename[cmd2-1];strcpy(filename,cmd2);printf("%s\n",filename);FILE *fp=NULL; FILE *fh=NULL; char buff[100];; memset(buff,0,sizeof(buff)); fp=popen(cmd1,"r");//将命令ls-l 同过管道读到fp fh=fopen(filename,"w+");// 创建一个可写的文件 fread(buff,1,sizeof(buff),fp);//将fp的数据流读到buff中 fwrite(buff,1,sizeof(buff),fh);//将buff的数据写入fh指向的文件中 pclose(fp); fclose(fh);int error = execvp(argv[0],argv);//if(error < 0)// perror("execvp");//printf("end\n"); }wait(NULL);//return 0;//return argv;
}int main()
{printf("> ");char command[100];fgets(command,100,stdin);char *cmd1,*cmd2;cmd1= strtok(command,">");cmd2= strtok(NULL,">");mysys(cmd1,cmd2);return 0;
}
7.sh3
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <linux/string.h>
#include <fcntl.h>void mysys(char *cmd1,char *cmd2)
{char c1[100];char c2[100];strcpy(c1,cmd1);strcpy(c2,cmd2);pid_t pid;pid=fork();//char *argv[10];//int i = 0;//char *s;if(pid == 0){FILE *fp1=NULL;FILE *fp2=NULL; //FILE *fh=NULL; char buff[100];; memset(buff,0,sizeof(buff)); fp1=popen(c1,"r");fp2=popen(c2,"r"); //fh=fopen(filename,"w+");// 创建一个可写的文件 fread(buff,1,sizeof(buff),fp1);//将fp的数据流读到buff中//fwrite(buff,1,sizeof(buff),stdout);//printf("\n");fread(buff,1,sizeof(buff),fp2);fwrite(buff,1,sizeof(buff),stdout);printf("\n");//fwrite(buff,1,sizeof(buff),fh);//将buff的数据写入fh指向的文件中 pclose(fp1); fclose(fp2);//int error = execvp(argv[0],argv);//if(error < 0)// perror("execvp");//printf("end\n"); }wait(NULL);//return 0;//return argv;
}int main()
{printf("> ");char command[100];fgets(command,100,stdin);char *cmd1,*cmd2,*filename;cmd1= strtok(command," ");//puts(cmd1);filename= strtok(NULL,"|");//puts(filename);cmd2= strtok(NULL,"\n");//puts(cmd2);char *command1= (char *)malloc(strlen(cmd1)+strlen(filename)+1);char *command2= (char *)malloc(strlen(cmd2)+strlen(filename)+1);strcpy(command1,cmd1);strcat(command1," ");strcat(command1,filename);//puts(command1);strcpy(command2,cmd2);strcat(command2," ");strcat(command2,filename);//puts(command2);mysys(command1,command2);return 0;
}
8.pi1
#include <stdio.h>
#include <pthread.h>
#include <math.h>
//int array[] = {1, 1, 1, 2, 2, 2};
#define NUMBER 65535
float worker_output=0;
void *worker(void *arg)
{int i;float w;for (i = 0; i < NUMBER / 2+1; i++){w=1.0/(i*2 + 1);for(int j=0;j<i;j++)w=-1*w;worker_output +=w;}return NULL;
}float master_output=0;
void master()
{int i;float m;for (i = NUMBER / 2+1; i < NUMBER; i++){m=1.0/(i*2 + 1);for(int j=0;j<i;j++)m=-1*m;master_output += m;}}int main()
{ pthread_t worker_tid;float total;pthread_create(&worker_tid, NULL, worker, NULL);master(); pthread_join(worker_tid, NULL);total = master_output + worker_output;printf("master_output = %f, worker_output = %f, total = %f\n", master_output, worker_output, total);return 0;
}
9.pi2
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>//int array[] = {1, 1, 1, 2, 2, 2};
#define NR_TOTAL 6
#define NR_CPU 2
#define NR_CHILD (NR_TOTAL/NR_CPU)struct param {int array;int start;int end;
};struct result {float sum;
};void *compute(void *arg)
{struct param *param;struct result *result;float sum = 0;int i;param = (struct param *)arg;for (i = param->start; i < param->end; i++)if(i%2)sum -= 1.0/(i*2+1);elsesum += 1.0/(i*2+1);result = malloc(sizeof(struct result));result->sum = sum;return result;
}int main()
{ pthread_t workers[NR_CPU];struct param params[NR_CPU]; int i;for (i = 0; i < NR_CPU; i++) {struct param *param;param = ¶ms[i];//param->array = array;param->start = i * NR_CHILD; param->end = (i + 1) * NR_CHILD;pthread_create(&workers[i], NULL, compute, param);}float sum = 0;for (i = 0; i < NR_CPU; i++) {struct result *result;pthread_join(workers[i], (void **)&result);sum += result->sum;free(result);}printf("sum = %f\n", sum);return 0;
}
10.sort
#include <stdio.h>
#include <pthread.h>
#define length 10
//#include <math.h>int array[10]={2,7,3,0,6,1,4,9,5,8};
struct position
{int start;int end;
};void *compute(void *p)
{struct position *P;P=(struct position *)p;int min,i,j,t; for(i=P->start;i<P->end;i++){{min=i;//查找最小值for(j=i+1;j<length;j++)if(array[min]>array[j])min=j;//交换if(min!=i){t=array[min];array[min]=array[i];array[i]=t;}}}return array;
}int main()
{ //printf("hello1\n");int *array1;int *array2;//printf("hello2\n");struct position p1,p2,p3;//printf("hello3\n");for(int i=0;i<length;i++){printf("%d ",array[i]);}printf("\n"); //printf("hello4\n");p1.start=0;p1.end=length/2;p2.start=length/2;p2.end=length;//位置初始化;p3.start=0;p3.end=length;//printf("hello5\n");pthread_t worker_tid1;pthread_t worker_tid2;//printf("hello6\n");pthread_create(&worker_tid1, NULL, compute, (void *)&p1) ;pthread_create(&worker_tid2, NULL, compute, (void *)&p2) ;//printf("hello7\n");pthread_join(worker_tid2,&array2);pthread_join(worker_tid1,&array1);//printf("hello8\n"); compute((void *)&p3);//printf("hello9\n");for(int i=0;i<length;i++){printf("%d ",array[i]);}printf("\n");return 0;}
11.pc1
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>#define CAPACITY 4
int buffer1[CAPACITY];
int buffer2[CAPACITY];
int buffer1_in;
int buffer1_out;
int buffer2_in;
int buffer2_out;void buffer_init()
{buffer1_in = 0;buffer1_out = 0;buffer2_in = 0;buffer2_out = 0;//size = 0;
}
int buffer1_is_empty()
{return buffer1_in == buffer1_out;
}int buffer1_is_full()
{return (buffer1_in + 1) % CAPACITY == buffer1_out;
}int buffer2_is_empty()
{return buffer2_in == buffer2_out;
}int buffer2_is_full()
{return (buffer2_in + 1) % CAPACITY == buffer2_out;
}
int get_buffer1_item()
{int item;item = buffer1[buffer1_out];buffer1_out = (buffer1_out + 1) % CAPACITY;return item;
}void put_buffer1_item(int item)
{buffer1[buffer1_in] = item;buffer1_in = (buffer1_in + 1) % CAPACITY;
}int get_buffer2_item()
{int item;item = buffer2[buffer2_out];buffer2_out = (buffer2_out + 1) % CAPACITY;return item;
}void put_buffer2_item(int item)
{buffer2[buffer2_in] = item;buffer2_in = (buffer2_in + 1) % CAPACITY;
}//pthread_mutex_t mutex;
pthread_mutex_t mutex1;
pthread_mutex_t mutex2;
pthread_cond_t wait_empty_buffer1;
pthread_cond_t wait_full_buffer1;
pthread_cond_t wait_empty_buffer2;
pthread_cond_t wait_full_buffer2;#define ITEM_COUNT (CAPACITY * 2)void *produce(void *arg)
{int i;int item;for (i = 0; i < ITEM_COUNT; i++) { pthread_mutex_lock(&mutex1);while (buffer1_is_full())pthread_cond_wait(&wait_empty_buffer1, &mutex1);item = 'a'+i;put_buffer1_item(item); printf(" produce item: %c\n", item); pthread_cond_signal(&wait_full_buffer1);pthread_mutex_unlock(&mutex1);}return NULL;
}
void *count(void *arg)
{int i;int item;for(i = 0; i < ITEM_COUNT; i++){pthread_mutex_lock(&mutex1);while(buffer1_is_empty())pthread_cond_wait(&wait_full_buffer1, &mutex1);item=get_buffer1_item()-0x20;pthread_cond_signal(&wait_empty_buffer1);pthread_mutex_unlock(&mutex1);pthread_mutex_lock(&mutex2);while(buffer2_is_full())pthread_cond_wait(&wait_empty_buffer2, &mutex2);put_buffer2_item(item);pthread_cond_signal(&wait_full_buffer2);pthread_mutex_unlock(&mutex2); }return NULL;}
void *consume(void *arg)
{int i;int item;for (i = 0; i < ITEM_COUNT; i++) { pthread_mutex_lock(&mutex2);while (buffer2_is_empty()) pthread_cond_wait(&wait_full_buffer2, &mutex2);item = get_buffer2_item();printf("consume item: %c\n", item); pthread_cond_signal(&wait_empty_buffer2);pthread_mutex_unlock(&mutex2);}return NULL;
}
int main()
{pthread_t producer;pthread_t counter;pthread_t consumer;buffer_init();pthread_create(&producer, NULL, produce, NULL);pthread_create(&producer, NULL, count, NULL);pthread_create(&consumer, NULL, consume, NULL);pthread_join(producer, NULL);pthread_join(counter, NULL);pthread_join(consumer, NULL);return 0;
}
12.pc2
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>#define CAPACITY 4
int buffer1[CAPACITY];
int buffer2[CAPACITY];
int buffer1_in;
int buffer1_out;
int buffer2_in;
int buffer2_out;void buffer_init()
{buffer1_in = 0;buffer1_out = 0;buffer2_in = 0;buffer2_out = 0;//size = 0;
}
int buffer1_is_empty()
{return buffer1_in == buffer1_out;
}int buffer1_is_full()
{return (buffer1_in + 1) % CAPACITY == buffer1_out;
}int buffer2_is_empty()
{return buffer2_in == buffer2_out;
}int buffer2_is_full()
{return (buffer2_in + 1) % CAPACITY == buffer2_out;
}
int get_buffer1_item()
{int item;item = buffer1[buffer1_out];buffer1_out = (buffer1_out + 1) % CAPACITY;return item;
}void put_buffer1_item(int item)
{buffer1[buffer1_in] = item;buffer1_in = (buffer1_in + 1) % CAPACITY;
}int get_buffer2_item()
{int item;item = buffer2[buffer2_out];buffer2_out = (buffer2_out + 1) % CAPACITY;return item;
}void put_buffer2_item(int item)
{buffer2[buffer2_in] = item;buffer2_in = (buffer2_in + 1) % CAPACITY;
}typedef struct {int value;pthread_mutex_t mutex;pthread_cond_t cond;
} sema_t;void sema_init(sema_t *sema, int value)
{sema->value = value;pthread_mutex_init(&sema->mutex, NULL);pthread_cond_init(&sema->cond, NULL);
}void sema_wait(sema_t *sema)
{pthread_mutex_lock(&sema->mutex);while (sema->value <= 0)pthread_cond_wait(&sema->cond, &sema->mutex);sema->value--;pthread_mutex_unlock(&sema->mutex);
}void sema_signal(sema_t *sema)
{pthread_mutex_lock(&sema->mutex);++sema->value;pthread_cond_signal(&sema->cond);pthread_mutex_unlock(&sema->mutex);
}sema_t mutex_sema1;
sema_t empty_buffer_sema1;
sema_t full_buffer_sema1;
sema_t mutex_sema2;
sema_t empty_buffer_sema2;
sema_t full_buffer_sema2;
#define ITEM_COUNT (CAPACITY * 2)void *produce(void *arg)
{int i;int item;for (i = 0; i < ITEM_COUNT; i++) { sema_wait(&empty_buffer_sema1);sema_wait(&mutex_sema1);item = 'a'+i;put_buffer1_item(item); printf(" produce item: %c\n", item); sema_signal(&mutex_sema1);sema_signal(&full_buffer_sema1);}return NULL;
}
void *count(void *arg)
{int i;int item;for(i = 0; i < ITEM_COUNT; i++){sema_wait(&full_buffer_sema1);sema_wait(&mutex_sema1);item=get_buffer1_item()-0x20;sema_signal(&mutex_sema1);sema_signal(&empty_buffer_sema1);sema_wait(&empty_buffer_sema2);sema_wait(&mutex_sema2);put_buffer2_item(item);sema_signal(&mutex_sema2);sema_signal(&full_buffer_sema2); }return NULL;}
void *consume(void *arg)
{int i;int item;for (i = 0; i < ITEM_COUNT; i++) { sema_wait(&full_buffer_sema2);sema_wait(&mutex_sema2);item = get_buffer2_item();printf("consume item: %c\n", item); sema_signal(&mutex_sema2);sema_signal(&empty_buffer_sema2);}return NULL;
}
int main()
{pthread_t producer;pthread_t counter;pthread_t consumer;sema_init(&mutex_sema1, 1);sema_init(&empty_buffer_sema1, CAPACITY - 1);sema_init(&full_buffer_sema1, 0);sema_init(&mutex_sema2, 1);sema_init(&empty_buffer_sema2, CAPACITY - 1);sema_init(&full_buffer_sema2, 0);pthread_create(&producer, NULL, produce, NULL);pthread_create(&producer, NULL, count, NULL);pthread_create(&consumer, NULL, consume, NULL);pthread_join(producer, NULL);pthread_join(counter, NULL);pthread_join(consumer, NULL);return 0;
}
NUAA 南航操作系统实验 代码部分相关推荐
- 西电软工操作系统实验:编译Ubuntu18.04新内核并添加系统调用(含代码以及详细分析)
西电软工操作系统实验一:编译Linux内核 目录 (一)前言 (二)实验内容 (三)实验环境 (四)实验过程 4.1安装虚拟机 4.2虚拟机换源 4.3 添加系统调用内核 4.4 下载编译所需的软件依 ...
- 操作系统课程实验代码汇总
操作系统课程实验代码汇总 本次内容供需要有相关实验需要的提供参考,代码下载方式在文末 文章目录 操作系统课程实验代码汇总 前言 一.进程管理 实验目的 代码 说明 二.进程调度 实验目的 说明 三.银 ...
- linux平台的实验描述,基于LINUX的操作系统实验平台的设计与实现
摘要: 操作系统原理课程是计算机专业的重要基础课程,该课程涉及大量抽象和深奥的概念.模型和算法,容易导致学习低效和困难. 本文针对操作系统教学中存在的不足,以Linux0.11版本内核为基础为操作系统 ...
- ucore操作系统实验笔记 - Lab1
最近一直都在跟清华大学的操作系统课程,这个课程最大的特点是有一系列可以实战的操作系统实验.这些实验总共有8个,我在这里记录实验中的一些心得和总结. Task1 这个Task主要是为了熟悉Makfile ...
- 操作系统实验4—磁盘调度
操作系统实验4-磁盘调度 文章目录 操作系统实验4-磁盘调度 实验描述 设计思路 上机代码 测试结果 心得体会 实验描述 实验内容: 编写一个磁盘调度程序,模拟操作系统对磁盘的调度. 实验目的: 本实 ...
- 操作系统实验2—实现动态分区分配模拟程序
操作系统实验2-实现动态分区分配模拟程序 文章目录 操作系统实验2-实现动态分区分配模拟程序 实验描述 设计思路 上机代码 测试结果 心得体会 实验描述 实验内容: 编写一个可变分区存储管理程序,模拟 ...
- 操作系统实验1—实现单处理机下的进程调度程序
操作系统实验1-实现单处理机下的进程调度程序 文章目录 操作系统实验1-实现单处理机下的进程调度程序 实验描述 设计思路 上机代码 测试结果 心得体会 实验描述 实验内容: 编写一个单处理机下的进程调 ...
- 操作系统实验——简易FAT16文件系统的实现
操作系统实验--简易FAT16文件系统的实现 前言 实验要求 FAT16基础知识 磁盘组成部分 分区原理 思路 完整代码 前言 暑假啦!呼,所有的补课终于也都结束了,虽然绩点还是一如既往的拉跨,但是很 ...
- 操作系统 实验3【动态分区存储管理】
操作系统 实验1[短作业优先调度算法(C++实现--FCFS\SJF\HRRN)] 操作系统 实验2[动态高优先权优先调度算法 C++实现] 操作系统 实验3[动态分区存储管理 Python实现] 操 ...
- Linux进程的创建和父子进程同步,操作系统实验报告_Linux进程创建与通信.doc
操作系统实验报告_Linux进程创建与通信 2011-2012学年第一学期 专 业: 班 级: 学 号: 姓 名:提交日期:2011年11月实验二 Linux进程创建与进程通信 [实验目的 1. 熟悉 ...
最新文章
- [置顶] 如何搭建一个 Data Guard 环境
- Linux 打包及压缩命令使用方法总结
- 十、调度算法----时间片轮转、优先级调度、多级反馈队列
- 移动端监听安卓手机返回键
- python3基本知识_Python3 - 基础知识、基本了解
- monty python dead parrot-BBC十大英剧神作出炉!
- 【Spring】SpringMVC 作用域传值的 4 种方式
- [JavaWeb-HTTP]HTTP_请求消息_请求头请求体
- 如何解析比特币中的交易原始数据rawData
- Python升级pip并安装opencv、moviepy包
- Cocos Creator 获取当前URL取参数
- paip.提升安全性----.net C#源码防止反编译以及源码加密
- 单片机的C语言应用程序设计实训教程,单片机的c语言程序设计实训
- 在Android上使用AutoNavi Map API开发自己的地图应用程序
- 工程图学与计算机绘图考查,工程图学与计算机绘图
- 支付系统中,账户体系的设计与记账处理
- 汇编实现吃豆子小程序
- 51单片机——外部中断
- openresty-lua代码的语法检查
- Dev-C++如何单步调试程序--8min学会自己找程序错误
热门文章
- Cannot load facet,unknow facet type web
- 相关搜索 --- 搜索中的推荐
- 理解无线电波极化与天线极化
- 蓝牙RFCOMM协议
- vue开发之图片加载不出来问题解决
- C#--解析DataMatrix二维码
- Codeforces Round #548 (Div. 2) 1139 D+2021天梯赛l3-3 解题报告(负二项式分布+莫比乌斯容斥+杜教筛(天梯赛))
- R语言实现结构方程模型
- 想成为“王者”的必备能力——领导力21法则
- 为什么Julia如此受欢迎?