操作系统 基于clone()系统调用

来源:互联网 发布:plc编程软件有哪些 编辑:程序博客网 时间:2024/05/22 02:22

 #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

 

原创粉丝点击