操作系统 基于clone()系统调用
2009-11-09 09:02
387 查看
#include "sched.h"
#include "pthread.h"
#include "stdio.h"
#include "stdlib.h"
#include "semaphore.h"
#include "string.h"
int producer(void *args);
int consumer(void *args);
pthread_mutex_t mutex ; // a mutex
sem_t product; //semaphore
sem_t warehouse;
char buffer[8][4];
int bp=0;
int main(int argc ,char **argv)
{
pthread_mutex_init(&mutex,NULL);
sem_init(&product,0,0);
sem_init(&warehouse,0,8);
int clone_flag,arg,retval;
char *stack;
clone_flag=CLONE_VM|CLONE_SIGHAND|CLONE_FS|CLONE_FILES;
int i;
for(i=0;i<2;i++)
{
arg=i;
stack=(char *)malloc(4096);
retval=clone((void *)producer,&(stack[4095]),clone_flag,(void *)&arg);
stack=(char *)malloc(4096);
retval=clone((void *)consumer,&(stack[4095]),clone_flag,(void *)&arg);
}
exit(1);
}
int producer(void *args)
{
int id=*((int *)args);
int i;
for(i=0;i<10;i++)
{
sleep(i+1);
sem_wait(&warehouse);
pthread_mutex_lock(&mutex);
if(id==0)
strcpy(buffer[bp],"aaa/0");
else
strcpy(buffer[bp],"bbb/0");
bp++;
printf("producer %d produce %s in %d/n",id,buffer[bp-1],bp-1);
pthread_mutex_unlock(&mutex);
sem_post(&product);
}
printf("producer %d is over!/n",id);
}
int consumer(void *args)
{
int id=*((int *)args);
int i;
for(i=0;i<10;i++)
{
sleep(10-i);
sem_wait(&product);
pthread_mutex_lock(&mutex);
bp--;
printf("consumer %d get %s in %d/n",id,buffer[bp],bp);
strcpy(buffer[bp],"zzz/0");
pthread_mutex_unlock(&mutex);
sem_post(&warehouse);
}
printf("consumer %d is over!/n",id);
}
编译的时候需要输入参数
gcc -pthread
#include "pthread.h"
#include "stdio.h"
#include "stdlib.h"
#include "semaphore.h"
#include "string.h"
int producer(void *args);
int consumer(void *args);
pthread_mutex_t mutex ; // a mutex
sem_t product; //semaphore
sem_t warehouse;
char buffer[8][4];
int bp=0;
int main(int argc ,char **argv)
{
pthread_mutex_init(&mutex,NULL);
sem_init(&product,0,0);
sem_init(&warehouse,0,8);
int clone_flag,arg,retval;
char *stack;
clone_flag=CLONE_VM|CLONE_SIGHAND|CLONE_FS|CLONE_FILES;
int i;
for(i=0;i<2;i++)
{
arg=i;
stack=(char *)malloc(4096);
retval=clone((void *)producer,&(stack[4095]),clone_flag,(void *)&arg);
stack=(char *)malloc(4096);
retval=clone((void *)consumer,&(stack[4095]),clone_flag,(void *)&arg);
}
exit(1);
}
int producer(void *args)
{
int id=*((int *)args);
int i;
for(i=0;i<10;i++)
{
sleep(i+1);
sem_wait(&warehouse);
pthread_mutex_lock(&mutex);
if(id==0)
strcpy(buffer[bp],"aaa/0");
else
strcpy(buffer[bp],"bbb/0");
bp++;
printf("producer %d produce %s in %d/n",id,buffer[bp-1],bp-1);
pthread_mutex_unlock(&mutex);
sem_post(&product);
}
printf("producer %d is over!/n",id);
}
int consumer(void *args)
{
int id=*((int *)args);
int i;
for(i=0;i<10;i++)
{
sleep(10-i);
sem_wait(&product);
pthread_mutex_lock(&mutex);
bp--;
printf("consumer %d get %s in %d/n",id,buffer[bp],bp);
strcpy(buffer[bp],"zzz/0");
pthread_mutex_unlock(&mutex);
sem_post(&warehouse);
}
printf("consumer %d is over!/n",id);
}
编译的时候需要输入参数
gcc -pthread
相关文章推荐
- Linux操作系统基础知识之六:系统调用
- android基于Socket的系统调用实现
- 浅析基于ARM的Linux下的系统调用的实现
- 操作系统6-系统调用和库
- 如何来实现一个Linux内核的系统调用(基于tiny4412开发板)
- 基于JMS消息中间件的分布式系统初探究(二) - 服务端反射调用组件方法
- Python常用模块种类的系统介绍及与操作系统相关的调用和操作
- 操作系统的学习(1)——启动,中断,异常和系统调用。
- 随笔:操作系统:系统调用的实现
- 随笔:操作系统:系统调用的实现
- Linux操作系统分析(4)- 更新内核与添加系统调用
- 【nachos】山东大学操作系统课设实验nachos系统(6)系统调用Exec()和Exit()
- Python常用模块种类的系统介绍及与操作系统相关的调用和操作
- 操作系统课程设计 基于DOS的多任务系统的实现
- 基于arm的linux系统调用分析
- ubuntu中实践操作系统第二章系统调用与课件不同之处
- 有些应用软件进行系统调用时,为了一些场景更好的实现最优的表现,因此需要调整操作系统参数:
- android客户端与服务器交互数据(基于SAOP协议的远程调用标准,通过webservice可以将不同操作系统平台,不同语言,不同技术整合)
- 如何来实现一个Linux内核的系统调用(基于tiny4412开发板)
- Python常用模块种类的系统介绍及与操作系统相关的调用和操作