我现在创建了一个信号量,初始值为1,同时启动了一个进程A,该进程在退出时会对信号量进行p操作,也就是减1;有另一个进程B调用semop函数,其中sem_op的值为0,即它在等待信号量为0;进程B先启动,进程A后启动,我认为进程B会在进程A退出后退出,这个理解正确吗
时间: 2023-09-25 07:10:07 浏览: 67
你的理解是不正确的。由于信号量的初始值为1,所以进程B调用`semop`函数时,信号量的值为1,`sem_op`为0,表示进程B需要等待信号量的值为0才能继续执行。当进程A启动后,它对信号量进行了P操作,信号量的值变为0。此时进程A退出时会对信号量再进行一次P操作,将信号量的值变为-1。此时进程B调用`semop`函数会被阻塞,直到有其他进程对信号量进行V操作,将信号量的值变为0,进程B才能继续执行。
因此,进程B不会在进程A退出后立即退出,而是会被阻塞,直到有其他进程对信号量进行V操作。
相关问题
我想要让进程B创建信号量,初始化为1,然后再启动进程A,进程A退出时执行一次p操作将信号量减为0,这样可以让进程B正常退出吗
可以,这是一种经典的进程同步方法。进程B创建并初始化信号量后,进程A可以通过执行p操作来申请该信号量,如果此时信号量的值为0,则表示资源已经被占用,进程A需要等待。当进程A退出时,执行一次p操作将信号量减为0,表示资源已经释放。此时进程B再执行p操作,会阻塞等待,直到进程A释放了资源。
需要注意的是,进程A和进程B必须共享同一个信号量,可以通过在共享内存中创建信号量来实现。另外,进程B必须在启动进程A之前创建信号量,否则进程A无法获取该信号量,程序会出现死锁。
我的意思是,进程A在启动时get信号量,并且只在退出时进行一次p操作;进程B会先启动并初始化信号量为1,然后等待信号量为0
好的,明白了。那么进程A在启动时,可以通过 `semget` 函数获取一个新的信号量集,然后调用 `semop` 函数进行一次 P 操作,将信号量的值减 1。这样,进程A就能够占用该信号量,其他进程无法占用。
进程B在启动时,可以先调用 `semget` 函数获取同样的信号量集,并且将其初始化为 1。然后,进程B可以通过 `semop` 函数进行一次 P 操作,将信号量的值减 1。由于此时进程A已经占用了该信号量,因此进程B会被阻塞,直到进程A退出时进行一次 V 操作,将信号量的值加 1,进程B才能继续执行。
当进程A退出时,可以通过 `semop` 函数进行一次 V 操作,将信号量的值加 1。这样,进程B就可以继续执行了。最后,进程B退出时,也要进行一次 V 操作,将信号量的值加 1,以便其他进程能够占用该信号量。
阅读全文