《物联网工程领域应用综合实训》实验报告
if (shmptr == (void*)-1) {
perror(\!\\n\ exit(1); }
int count = 0; int j;
for(j = 0; j < N_WORKTIME; j++) {
waitSem(sem_id, SEM_EMPTY); waitSem(sem_id, MUTEX); sleep(get_random());
printf(\n\
printf(\我是第 %d 个生产者进程,PID = %d\\n\i + 1, getpid()); /*生产产品*/
char c = getRandChar(); //随机获取字母 shmptr -> str[shmptr->tail] = c;
shmptr -> tail = (shmptr->tail + 1) % MAX_BUFFER_SIZE; shmptr -> is_empty = 0; //写入新产品 shmptr -> num++; /*打印输出结果*/
printTime(); //程序运行时间 int p;
printf(\缓冲区数据(%d个):\打印缓冲区中的数据
p = (shmptr->tail-1 >= shmptr->head) ? (shmptr->tail-1) : (shmptr->tail-1 + MAX_BUFFER_SIZE);
11 / 18
《物联网工程领域应用综合实训》实验报告
for (p; !(shmptr -> is_empty) && p >= shmptr -> head; p--) {
printf(\ }
printf(\生产者 %d 放入 '%c'. \\n\
printf(\n\
fflush(stdout);
sigSem(sem_id, MUTEX); sigSem(sem_id, SEM_FULL); }
//将共享段与进程之间解除连接 shmdt(shmptr); exit(0); } }
for(i = 0; i < N_CONSUMER; i++) {
child = fork();
if(child < 0)//调用fork失败 {
perror(\ exit(1); }
else if(child == 0) {
int count = 0;
shmptr = shmat(shm_id, 0, 0); //将申请的共享内存附加到申请通信的
12 / 18
《物联网工程领域应用综合实训》实验报告
进程空间
if (shmptr == (void*)-1) {
perror(\!\\n\ exit(1); }
int j;
for(j = 0; j < N_WORKTIME; j++) {
waitSem(sem_id, SEM_FULL); waitSem(sem_id, MUTEX); sleep(get_random());
printf(\n\
printf(\我是第 %d 个消费者进程,PID = %d\\n\i + 1, getpid()); /*消费数据*/
char lt = shmptr -> str[shmptr -> head];
shmptr -> head = (shmptr -> head + 1) % MAX_BUFFER_SIZE; shmptr -> is_empty = (shmptr->head == shmptr->tail); // shmptr -> num--; /*打印输出结果*/
printTime(); //程序运行时间 int p;
printf(\缓冲区数据(%d个):\打印缓冲区中的数据
p = (shmptr -> tail - 1 >= shmptr -> head) ? (shmptr -> tail-1) : (shmptr -> tail - 1 + MAX_BUFFER_SIZE);
for (p; !(shmptr -> is_empty) && p >= shmptr -> head; p--)
13 / 18
《物联网工程领域应用综合实训》实验报告
{
printf(\ }
printf(\消费者 %d 取出 '%c'. \\n\
printf(\n\
fflush(stdout);
sigSem(sem_id,MUTEX); sigSem(sem_id,SEM_EMPTY); }
//将共享段与进程之间解除连接 shmdt(shmptr); exit(0); } }
//主进程最后退出
while (wait(0) != -1);
//将共享段与进程之间解除连接 shmdt(shmptr);
//对共享内存区执行控制操作
shmctl(shm_id,IPC_RMID,0);//当cmd为IPC_RMID时,删除该共享段 shmctl(sem_id,IPC_RMID,0); printf(\主进程运行结束!\\n\ fflush(stdout); exit(0); return 0; }
14 / 18
《物联网工程领域应用综合实训》实验报告
实验二:
#include
#define N 5 //哲学家数量
#define LEFT(i) (i+N-1)%N //左手边哲学家编号 #define RIGHT(i) (i+1)%N //右手边哲家编号
#define HUNGRY 0 //饥饿 #define THINKING 1 //思考 #define EATING 2 //吃饭
#define U_SECOND 1000000 //1秒对应的微秒数 pthread_mutex_t mutex; //互斥量
int state[N]; //记录每个哲学家状态
//每个哲学家的思考时间,吃饭时间,思考开始时间,吃饭开始时间 clock_t thinking_time[N], eating_time[N], start_eating_time[N], start_thinking_time[N]; //线程函数
void *thread_function(void *arg);
int main() {
15 / 18