文章目录

  • 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 = &params[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 南航操作系统实验 代码部分相关推荐

  1. 西电软工操作系统实验:编译Ubuntu18.04新内核并添加系统调用(含代码以及详细分析)

    西电软工操作系统实验一:编译Linux内核 目录 (一)前言 (二)实验内容 (三)实验环境 (四)实验过程 4.1安装虚拟机 4.2虚拟机换源 4.3 添加系统调用内核 4.4 下载编译所需的软件依 ...

  2. 操作系统课程实验代码汇总

    操作系统课程实验代码汇总 本次内容供需要有相关实验需要的提供参考,代码下载方式在文末 文章目录 操作系统课程实验代码汇总 前言 一.进程管理 实验目的 代码 说明 二.进程调度 实验目的 说明 三.银 ...

  3. linux平台的实验描述,基于LINUX的操作系统实验平台的设计与实现

    摘要: 操作系统原理课程是计算机专业的重要基础课程,该课程涉及大量抽象和深奥的概念.模型和算法,容易导致学习低效和困难. 本文针对操作系统教学中存在的不足,以Linux0.11版本内核为基础为操作系统 ...

  4. ucore操作系统实验笔记 - Lab1

    最近一直都在跟清华大学的操作系统课程,这个课程最大的特点是有一系列可以实战的操作系统实验.这些实验总共有8个,我在这里记录实验中的一些心得和总结. Task1 这个Task主要是为了熟悉Makfile ...

  5. 操作系统实验4—磁盘调度

    操作系统实验4-磁盘调度 文章目录 操作系统实验4-磁盘调度 实验描述 设计思路 上机代码 测试结果 心得体会 实验描述 实验内容: 编写一个磁盘调度程序,模拟操作系统对磁盘的调度. 实验目的: 本实 ...

  6. 操作系统实验2—实现动态分区分配模拟程序

    操作系统实验2-实现动态分区分配模拟程序 文章目录 操作系统实验2-实现动态分区分配模拟程序 实验描述 设计思路 上机代码 测试结果 心得体会 实验描述 实验内容: 编写一个可变分区存储管理程序,模拟 ...

  7. 操作系统实验1—实现单处理机下的进程调度程序

    操作系统实验1-实现单处理机下的进程调度程序 文章目录 操作系统实验1-实现单处理机下的进程调度程序 实验描述 设计思路 上机代码 测试结果 心得体会 实验描述 实验内容: 编写一个单处理机下的进程调 ...

  8. 操作系统实验——简易FAT16文件系统的实现

    操作系统实验--简易FAT16文件系统的实现 前言 实验要求 FAT16基础知识 磁盘组成部分 分区原理 思路 完整代码 前言 暑假啦!呼,所有的补课终于也都结束了,虽然绩点还是一如既往的拉跨,但是很 ...

  9. 操作系统 实验3【动态分区存储管理】

    操作系统 实验1[短作业优先调度算法(C++实现--FCFS\SJF\HRRN)] 操作系统 实验2[动态高优先权优先调度算法 C++实现] 操作系统 实验3[动态分区存储管理 Python实现] 操 ...

  10. Linux进程的创建和父子进程同步,操作系统实验报告_Linux进程创建与通信.doc

    操作系统实验报告_Linux进程创建与通信 2011-2012学年第一学期 专 业: 班 级: 学 号: 姓 名:提交日期:2011年11月实验二 Linux进程创建与进程通信 [实验目的 1. 熟悉 ...

最新文章

  1. [置顶] 如何搭建一个 Data Guard 环境
  2. Linux 打包及压缩命令使用方法总结
  3. 十、调度算法----时间片轮转、优先级调度、多级反馈队列
  4. 移动端监听安卓手机返回键
  5. python3基本知识_Python3 - 基础知识、基本了解
  6. monty python dead parrot-BBC十大英剧神作出炉!
  7. 【Spring】SpringMVC 作用域传值的 4 种方式
  8. [JavaWeb-HTTP]HTTP_请求消息_请求头请求体
  9. 如何解析比特币中的交易原始数据rawData
  10. Python升级pip并安装opencv、moviepy包
  11. Cocos Creator 获取当前URL取参数
  12. paip.提升安全性----.net C#源码防止反编译以及源码加密
  13. 单片机的C语言应用程序设计实训教程,单片机的c语言程序设计实训
  14. 在Android上使用AutoNavi Map API开发自己的地图应用程序
  15. 工程图学与计算机绘图考查,工程图学与计算机绘图
  16. 支付系统中,账户体系的设计与记账处理
  17. 汇编实现吃豆子小程序
  18. 51单片机——外部中断
  19. openresty-lua代码的语法检查
  20. Dev-C++如何单步调试程序--8min学会自己找程序错误

热门文章

  1. Cannot load facet,unknow facet type web
  2. 相关搜索 --- 搜索中的推荐
  3. 理解无线电波极化与天线极化
  4. 蓝牙RFCOMM协议
  5. vue开发之图片加载不出来问题解决
  6. C#--解析DataMatrix二维码
  7. Codeforces Round #548 (Div. 2) 1139 D+2021天梯赛l3-3 解题报告(负二项式分布+莫比乌斯容斥+杜教筛(天梯赛))
  8. R语言实现结构方程模型
  9. 想成为“王者”的必备能力——领导力21法则
  10. 为什么Julia如此受欢迎?