就是通过信号量控制进程的同步问题,可是下面的程序只有输入,这是为什么呢,开始子进程等待,父进程输入后,也进入等待, 然后唤醒队列中的子进程,
sem_p();sem_v();这是不是有问题啊
sem_init(0) //初始化信号量为0
pid = fork();
if(pid == 0)
{
sem_p(semid);
while()
{
输出;
sem_p();
sem_v();
}
}
else if(pid > 0)
{
while()
{
输入;
sem_p();
sem_v();
}
}
8 个解决方案
#1
这样呢?
if(pid == 0)
{
while()
{
sem_p();
输出;
}
}
else if(pid > 0)
{
while()
{
输入;
sem_v();
}
}
if(pid == 0)
{
while()
{
sem_p();
输出;
}
}
else if(pid > 0)
{
while()
{
输入;
sem_v();
}
}
#2
我知道我错的原因是,因为
else if(pid > 0)
{
while()
{
输入;
sem_p(); //这块已经是这个进程进入等待,没有执行下面的释放资源,所以父子进程都在等待
sem_v();
}
}
你的上面的写法我试过了,是可以,但是前提是我的输入输出都得是阻塞的是吧?否则就没有顺序了是吧
#3
同步是由信号灯来保证的,和输入/输出是否阻塞没有关系吧..
#4
上面的程序改为
if(pid == 0)
{
while(1)
{
sem_p();
printf("child\n");
}
}
else if(pid > 0)
{
while(1)
{
printf("father\n");
sem_v();
}
}
可是上面你那种写法,父进程一直进行循环操作,一直输出father,这样用信号量也没法保证child 和 father 交替输出啊
#5
我之前的那个逻辑不是要交替输出的,是生产者/消费者的模式
生产者不停的生成,消费者进行消费,如果没有可用资源时等待
如果要交替输出,这样
sem_init(1) //初始化信号量为1
pid = fork();
if(pid == 0)
{
while()
{
sem_p();
输出;
sem_v();
}
}
else if(pid > 0)
{
while()
{
sem_p();
输入;
sem_v();
}
}
生产者不停的生成,消费者进行消费,如果没有可用资源时等待
如果要交替输出,这样
sem_init(1) //初始化信号量为1
pid = fork();
if(pid == 0)
{
while()
{
sem_p();
输出;
sem_v();
}
}
else if(pid > 0)
{
while()
{
sem_p();
输入;
sem_v();
}
}
#6
不过这样可能也不能完全保证交替输出
最好用两个信号灯,这个进程完成之后,为另外一个进程的信号灯+1,然后等待自己的信号灯可用
最好用两个信号灯,这个进程完成之后,为另外一个进程的信号灯+1,然后等待自己的信号灯可用
#7
如果一个信号灯上面那样写好像也不成吧,他们的执行速度和顺序还是不一定能保证交替执行吧???
两个信号灯该怎么写啊,
int semid[2];
semid = semget(ftok(".",'a'),2,0666 | IPC_CREAT);
然后用semid[0],semid[1]
是这样吗?
#8
对
然后semop 时指定操作哪一个..
然后semop 时指定操作哪一个..
#1
这样呢?
if(pid == 0)
{
while()
{
sem_p();
输出;
}
}
else if(pid > 0)
{
while()
{
输入;
sem_v();
}
}
if(pid == 0)
{
while()
{
sem_p();
输出;
}
}
else if(pid > 0)
{
while()
{
输入;
sem_v();
}
}
#2
我知道我错的原因是,因为
else if(pid > 0)
{
while()
{
输入;
sem_p(); //这块已经是这个进程进入等待,没有执行下面的释放资源,所以父子进程都在等待
sem_v();
}
}
你的上面的写法我试过了,是可以,但是前提是我的输入输出都得是阻塞的是吧?否则就没有顺序了是吧
#3
同步是由信号灯来保证的,和输入/输出是否阻塞没有关系吧..
#4
上面的程序改为
if(pid == 0)
{
while(1)
{
sem_p();
printf("child\n");
}
}
else if(pid > 0)
{
while(1)
{
printf("father\n");
sem_v();
}
}
可是上面你那种写法,父进程一直进行循环操作,一直输出father,这样用信号量也没法保证child 和 father 交替输出啊
#5
我之前的那个逻辑不是要交替输出的,是生产者/消费者的模式
生产者不停的生成,消费者进行消费,如果没有可用资源时等待
如果要交替输出,这样
sem_init(1) //初始化信号量为1
pid = fork();
if(pid == 0)
{
while()
{
sem_p();
输出;
sem_v();
}
}
else if(pid > 0)
{
while()
{
sem_p();
输入;
sem_v();
}
}
生产者不停的生成,消费者进行消费,如果没有可用资源时等待
如果要交替输出,这样
sem_init(1) //初始化信号量为1
pid = fork();
if(pid == 0)
{
while()
{
sem_p();
输出;
sem_v();
}
}
else if(pid > 0)
{
while()
{
sem_p();
输入;
sem_v();
}
}
#6
不过这样可能也不能完全保证交替输出
最好用两个信号灯,这个进程完成之后,为另外一个进程的信号灯+1,然后等待自己的信号灯可用
最好用两个信号灯,这个进程完成之后,为另外一个进程的信号灯+1,然后等待自己的信号灯可用
#7
如果一个信号灯上面那样写好像也不成吧,他们的执行速度和顺序还是不一定能保证交替执行吧???
两个信号灯该怎么写啊,
int semid[2];
semid = semget(ftok(".",'a'),2,0666 | IPC_CREAT);
然后用semid[0],semid[1]
是这样吗?
#8
对
然后semop 时指定操作哪一个..
然后semop 时指定操作哪一个..