急求!!多线程生产者消费者问题的c语言程序,要源码、已在linux中执行过的文件,最好有截图!!

在线等!!今日内提交再追加50分!!!谢谢高手啦!!!

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <semaphore.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/time.h>
#include<string.h>

#define BUFSIZE 4096

#define SEM_IN_TASK "INX_TASK"
#define SEM_OUT_TASK "OUTX_TASK"

sem_t *sem_in;
sem_t *sem_out;

main(int argc, char** argv) // map a normal file as shared mem:
{
int fd,i;
char *p_map;
char temp;

fd=open(argv[1],O_CREAT|O_RDWR|O_TRUNC,00777);
//lseek(fd,sizeof(people)*5-1,SEEK_SET);
write(fd,"",1);

p_map = (char*) mmap( NULL,BUFSIZE,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0 );//建立共享内存
close( fd );

sem_unlink(SEM_IN_TASK);
sem_unlink(SEM_OUT_TASK);

sem_in = sem_open(SEM_IN_TASK,O_CREAT|O_EXCL,0644,1); //1ok
sem_out=sem_open(SEM_OUT_TASK,O_CREAT|O_EXCL,0644,0); //0ok
printf("[sem_in] [%d]\n",sem_in);
printf("[sem_out] [%d]\n",sem_out);

if(sem_in == SEM_FAILED||sem_out == SEM_FAILED)
{
perror("wangsha-unable to create semaphore");
sem_unlink(SEM_IN_TASK);
sem_unlink(SEM_OUT_TASK);
exit(-1);
}

memset(p_map,0,BUFSIZE);

while(1)
{
//printf("---------A waitting B-----------\n\n\n\n");
sem_wait(sem_out);

printf("A:%s\n",p_map );

memset(p_map,'a',100);

sem_post(sem_in);

//printf("------------A emit B-----------\n\n\n\n");
}
munmap( p_map, BUFSIZE );
printf( "umap ok \n" );
}

#include <sys/mman.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <semaphore.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/time.h>
#include<string.h>

#define SEM_IN_TASK "INX_TASK"
#define SEM_OUT_TASK "OUTX_TASK"

#define BUFSIZE 4096

sem_t *sem_in;
sem_t *sem_out;

main(int argc, char** argv) // map a normal file as shared mem:
{
int fd =-1;
int i= 0;
char *p_map;
double consumetime = 0.0;
struct timeval process_stat , process_end;

fd=open( argv[1],O_CREAT|O_RDWR,00777 );
p_map = (char*)mmap(NULL,BUFSIZE,PROT_READ|PROT_WRITE, MAP_SHARED,fd,0);

sem_in = sem_open(SEM_IN_TASK,O_CREAT,0644,0); //0ok
sem_out=sem_open(SEM_OUT_TASK,O_CREAT,0644,1); //1ok
printf("[sem_in] [%d]\n",sem_in);
printf("[sem_out] [%d]\n",sem_out);

if(sem_in == SEM_FAILED||sem_out == SEM_FAILED)
{
perror("unable to create semaphore-wang");
sem_unlink(SEM_OUT_TASK);
sem_unlink(SEM_IN_TASK);
exit(-1);
}
memset(p_map,0,BUFSIZE);
//gettimeofday(&process_stat,NULL);
//while(1)
for(i =0;i<50000;i++)
{
memset(p_map,'b',100);
//printf("------------B emit A-----------\n\n\n\n");
sem_post(sem_out);
usleep(200);
sem_wait(sem_in);
//printf("------------A emit B-----------\n\n\n\n");
printf( "B:%s\n",p_map );
}
//gettimeofday(&process_end,NULL);
//consumetime = (double)(process_end.tv_sec - process_stat.tv_sec)*1e6 +(double)(process_end.tv_usec - process_stat.tv_usec)/1e6;
//printf("consumetime:[%f]\n",consumetime);

munmap( p_map,BUFSIZE );
}
如果对你有帮助,请给分哦,谢谢!
温馨提示:内容为网友见解,仅供参考
无其他回答

在linux下用c语言实现用多进程同步方法演示“生产者-消费者”问题
开始时没有产品sem_t empty_sem; \/\/ 同步信号量, 当满了时阻止生产者放产品sem_t full_sem; \/\/ 同步信号量, 当没产品时阻止消费者消费pthread_mutex_t mutex; \/\/ 互斥信号量, 一次只有一个线程访问缓冲int product_id = 0; \/\/生产者idint prochase_id = 0; \/\/消费者id\/* 打...

使用C语言编写程序在Linux环境中运行c在linux上运行
首先,要在Linux环境中运行C语言程序,必须先安装有C语言编译器,最好的选择是GCC,GCC是一款强大的、免费的、多功能的C语言编译器。如果您已经安装了GCC,可以使用以下命令来检测GCC是否已安装:`gcc -v`如果返回信息说明GCC已安装,则可以使用GCC编译C语言程序。编译C语言程序需要使用gcc命令,编写程序...

生产者消费者问题--进程
现要用c语言(而不是c++,vc++,java,c#等语言)在linux操作系统下实现生产者消费者问题,就是要产生两个进程而不是简单的模拟,哪位高手有源代码啊,我急需!!!要尽量简单一点,... 现要用c语言(而不是c++,vc++,java,c#等语言)在linux操作系统下实现生产者消费者问题,就是要产生两个进程而不是简单的模拟,哪位...

在Linux系统中,如何运行一个C语言程序?
1、打开kali linux的终端。创建一个文件并命名为test.c。在终端输入:touch test.c。2、可以看到已经生成了一个后缀为test.c的源文件。然后用vim工具打开这个文件并编写代码。在终端中输入:vim test.c或者gvim test.c打开这个文件并编写代码。3、编写完了这个代码。现在开始编译源文件。在终端中输入:...

Linux中,运行一个C语言程序如何运行
在Linux中,可以使用gcc编译器编译C语言程序,生成可执行文件,并最终执行。具体步骤如下:1、编译。由.c文件生成.o文件,写作:gcc a.c -o a.o -c这个命令可以将a.c编译成a.o。如果存在多个文件,可以逐个编译,即a.c b.c...生成a.o b.o...等。2、链接。由.o文件生成可执行文件,...

c语言源程序文件的后缀名是经过编译连接后生成的文件的后缀是
C语言源程序文件的后缀名通常是".c",这是最常见的C语言源代码文件格式。然而,经过编译和链接后,生成的可执行文件的后缀名会有所不同,通常为".exe"(Windows操作系统)或".out"(Unix\/Linux操作系统)。这是因为编译后的程序代码已经被编译成了机器可执行的二进制代码,而不再需要源代码文件来...

在linux下c语言编程有关进程的问题
不太了解c的多进程(多线程?)编程,没看懂这个程序,我猜原因可能有:进程(线程)是无序进行的 printf有输出缓存(就是使用printf输出,不一定会立即输出)相关资料:printf输出函数,每执行一个printf输出函数,输出的数不是“肯定立刻”打印到屏幕上的,只有遇到一下几种情况时,printf输出的数据(...

Linux系统中一般使用什么语言编程呀?
而驳斥C++。虽然没必要拒绝C++,但是,不可否认,C更适合linux~。Linux操作系统主要包括内核和组件系统。Linux内核大部分是用C语言编写的,还有部分是用汇编语言写的,因为在对于硬件上,汇编有更好的性能和速度。Linux的一些组件系统和附加应用程序是用C、C++、Python、perl等语言写的。

C语言的编译过程是怎样的?
C语言编译过程详解C语言的编译链接过程是要把我们编写的一个C程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。链接是把目标文件、操作系统的启动代码和用到的库文件进行组织形成最终生成可执行代码的过程。过程图解如下: 从...

为什么要使用Linux系统linux有什么好的
Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux操作系统诞生于1991 年...

相似回答