linux中信号量的简单问题???

时间:2021-12-13 05:20:11
linux 信号量问题
就是通过信号量控制进程的同步问题,可是下面的程序只有输入,这是为什么呢,开始子进程等待,父进程输入后,也进入等待, 然后唤醒队列中的子进程
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();
    }
}

#2


引用 1 楼 justkk 的回复:
这样呢?
if(pid == 0)
{
  while()
  {
  sem_p();
  输出;
  }
}
else if(pid > 0)
{
  while()
  {
  输入;
  sem_v();
  }
}


我知道我错的原因是,因为
else if(pid > 0)
{
  while()
  {
  输入;
 sem_p();  //这块已经是这个进程进入等待,没有执行下面的释放资源,所以父子进程都在等待
  sem_v();
  }
}

你的上面的写法我试过了,是可以,但是前提是我的输入输出都得是阻塞的是吧?否则就没有顺序了是吧

#3


同步是由信号灯来保证的,和输入/输出是否阻塞没有关系吧..

#4


引用 3 楼 justkk 的回复:
同步是由信号灯来保证的,和输入/输出是否阻塞没有关系吧..



上面的程序改为

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();
  }
}

#6


不过这样可能也不能完全保证交替输出
最好用两个信号灯,这个进程完成之后,为另外一个进程的信号灯+1,然后等待自己的信号灯可用

#7


引用 6 楼 justkk 的回复:
不过这样可能也不能完全保证交替输出
最好用两个信号灯,这个进程完成之后,为另外一个进程的信号灯+1,然后等待自己的信号灯可用


如果一个信号灯上面那样写好像也不成吧,他们的执行速度和顺序还是不一定能保证交替执行吧???
两个信号灯该怎么写啊,
int semid[2];
semid = semget(ftok(".",'a'),2,0666 | IPC_CREAT);
然后用semid[0],semid[1]  
是这样吗?

#8



然后semop 时指定操作哪一个..

#1


这样呢?
if(pid == 0)
{
    while()
    {
        sem_p();
        输出;
    }
}
else if(pid > 0)
{
    while()
    {
        输入;
        sem_v();
    }
}

#2


引用 1 楼 justkk 的回复:
这样呢?
if(pid == 0)
{
  while()
  {
  sem_p();
  输出;
  }
}
else if(pid > 0)
{
  while()
  {
  输入;
  sem_v();
  }
}


我知道我错的原因是,因为
else if(pid > 0)
{
  while()
  {
  输入;
 sem_p();  //这块已经是这个进程进入等待,没有执行下面的释放资源,所以父子进程都在等待
  sem_v();
  }
}

你的上面的写法我试过了,是可以,但是前提是我的输入输出都得是阻塞的是吧?否则就没有顺序了是吧

#3


同步是由信号灯来保证的,和输入/输出是否阻塞没有关系吧..

#4


引用 3 楼 justkk 的回复:
同步是由信号灯来保证的,和输入/输出是否阻塞没有关系吧..



上面的程序改为

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();
  }
}

#6


不过这样可能也不能完全保证交替输出
最好用两个信号灯,这个进程完成之后,为另外一个进程的信号灯+1,然后等待自己的信号灯可用

#7


引用 6 楼 justkk 的回复:
不过这样可能也不能完全保证交替输出
最好用两个信号灯,这个进程完成之后,为另外一个进程的信号灯+1,然后等待自己的信号灯可用


如果一个信号灯上面那样写好像也不成吧,他们的执行速度和顺序还是不一定能保证交替执行吧???
两个信号灯该怎么写啊,
int semid[2];
semid = semget(ftok(".",'a'),2,0666 | IPC_CREAT);
然后用semid[0],semid[1]  
是这样吗?

#8



然后semop 时指定操作哪一个..