apue第二版,刚讲完进程控制和进程关系两章
伪代码好弄,就是实现起来有点困难
网上找了段代码,但不知道lock函数是干吗用的??不太懂,哪位高手能帮解释下
具体的lock函数怎么编?
#i nclude "apue.h"
#i nclude "lock.c"
#i nclude "lock.h"
#define N 5
static char* forks[5]={"fork0","fork1","fork2","fork3","fork4"};
int nsecs=2; //进餐和沉思的持续时间值,缺省值为2秒
pid_t pid;
void philosopher(int i);
void takeFork(int i);
void putFork(int i);
void thinking(int i,int nsecs);
void eating(int i,int nsecs);
int
main (int argc, char *argv[]) {
int i=0;
if(argc==3 && !strcmp(argv[1],"-t") ) nsecs=atol(argv[2]); //修改进餐和沉思的持续时间值 atol函数将字符串转换为整数
for(i=0;i<N;i++) initlock(forks); //清除掉上次运行遗留下的文件
for (i=0; i<N; i++){
pid=fork() ; //创建5个进程
if (pid == 0)
{
philosopher(i);
}// if
}//for
wait(NULL); //父进程等待子进程的结束
}
void philosopher(int i)
{
while(1) {
thinking(i,nsecs);
takeFork(i);
eating(i,nsecs);
putFork(i);
}
}
void takeFork(int i)
{
if(i == N-1) {
lock(forks[0]);
lock(forks);
}
else {
lock(forks);
lock (forks[i+1]);
}
}
void putFork(int i)
{
if(i == N-1) {
unlock(forks[0]);
unlock(forks);
}
else {
unlock(forks);
unlock (forks[i+1]);
}
}
void thinking(int i, int nsecs)
{
printf("philosopher %d is thinking\n",i);
sleep(nsecs);
}
void eating(int i,int nsecs)
{
printf("philosopher %d is eating\n",i);
sleep(nsecs);
}
|