void *Consumer()
{
// ============================= begin ======================
//请补充消费者线程函数代码
int nextc = 0;
int i = 0;
for(; i < 10; ++i)
{
int time = rand() % 10 + 1;
usleep(time*100000);
sem_wait(&full);
pthread_mutex_lock(&mutex);
nextc=buffer[out];
printf("Consume one message:%d\n", nextc);
fflush(stdout);//printf后请一定调用这句刷新输出缓存
out = (out + 1) % SIZE;
pthread_mutex_unlock(&mutex); //互斥锁解锁
sem_post(&empty);
}
// ============================= end ========================
}
对比题目提供的《生产函数:Producer()》
cs复制代码
int in = 0;
int out = 0;
int buffer[SIZE];
sem_t empty;
sem_t full;
pthread_mutex_t mutex;
void *Producer()
{
int nextp = 0;
int i = 0;
for(; i < 10; ++i)
{
int time = rand() % 10 + 1;
usleep(time*100000);
sem_wait(&empty);
pthread_mutex_lock(&mutex);
buffer[in] = nextc;
printf("Produce one message:%d\n", nextp);
fflush(stdout);//printf后请一定调用这句刷新输出缓存
in = (in + 1) % SIZE;
pthread_mutex_unlock(&mutex); //互斥锁解锁
sem_post(&full);
}
}
(2)第2关:进程互斥和同步
(这个就简单了!!结合上面学的东西,以及仿照这个题目女儿的"苹果"消费函数写就好)
把消费等待的信号换成"orange(桔子)"
把printf(....)输出换一下就好了
儿子消费函数答案
cs复制代码
void *Son()
{
// ============================== begin ===========================
//请添加儿子线程的函数代码
while(1)
{
int time = rand() % 10 + 1; //随机使程序睡眠0点几秒
usleep(time * 100000);
sem_wait(&orange);
pthread_mutex_lock(&mutex);
printf("儿子取了一个桔子\n") ;
fflush(stdout);
pthread_mutex_unlock(&mutex); //互斥锁解锁
sem_post(&empty);
}
// ============================== end ==============================
}
for ( i = 0 ; i < MAX_SEMAPHORES ; i++ )
{
// =================================== begin ===============================
/*请调用semctl函数,读取并输出与上述数组输出相同的输出*/
// 注意:getval_arg.val 在这里不需要设置,因为 GETVAL 不使用它
int x = semctl(semid, i, GETVAL);
printf("Semaphore %d, value %d\n", i, x);
// =================================== end ===============================
}
for ( i = 0 ; i < MAX_SEMAPHORES ; i++ )
{
// =================================== begin ===============================
/*请调用semctl函数,读取并输出与上述数组输出相同的输出*/
// 注意:getval_arg.val 在这里不需要设置,因为 GETVAL 不使用它
int x = semctl(semid, i, GETVAL);
if (x == -1) {
printf("GETVAL for semaphore %d failed (%d)\n", i, errno);
exit(EXIT_FAILURE);
}
printf("Semaphore %d, value %d\n", i, x);
// =================================== end ===============================
}
五、基于命名管道与信号的进程间通信
(1)第1关:命名管道与信号IPC操作考查
(没啥好说的,不会的操作系统考试就靠记呗!!)
**sleep(1);**休眠1秒
打开读通道------> open("FIFO",O_RDONLY);
打开写通道------> open("FIFO",O_WRONLY);
开始写------>write(fd,"heool0penEuler",1);
答案如下:
cs复制代码
if(pid==0)
{
// ============================= begin =========================
/*子进程打开读管道,随后关闭管道*/
int fd;
fd = open("FIFO",O_RDONLY); /*rd->only 写*/
/*关闭*/
close(fd);
}
else
{
/*父进程打开写通道,休眠1秒,尝试写入*/
int fd;
fd = open("FIFO",O_WRONLY); /*wr->only 写*/
int ret;
sleep(1); /*休眠1秒*/
/*写入*/
ret = write(fd,"heool0penEuler",1);
// ============================= end =========================
}