【发布时间】:2026-01-21 09:45:01
【问题描述】:
我必须创建一个程序来同步两个进程,每个进程只打印一个字母,这样每当我们观察程序的输出时,"A" 和 "B" 的数量之间的差异不大于 2。
所以这会被接受:
BAABBAABBABA
这不会是因为它打印了 4 个 B 而只打印了 2 个 A:
ABBABB
所以对于初学者,我决定使用 POSIX 信号量。
我创建了两个信号量,使用 sem_open 为它们提供所有权限
然后我创建了两个子进程,对于每个子进程,我打开我创建的信号量,如sem_open 的手册页中所述并对其进行操作。
我认为这不是 sem_post 和 sem_wait 的逻辑问题,因为程序似乎忽略了它们。
所以我的问题是。出了什么问题?
编辑:我真的不需要解决问题的方法。仅一些指导将不胜感激并欢迎作为答案。提前谢谢!
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <ctype.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <semaphore.h>
int main(void){
sem_t *semA = sem_open("/semA", O_CREAT|O_EXCL, S_IRWXU | S_IRWXG | S_IRWXO, 0); //Initialize semaphore(= 0) for process A
sem_t *semB = sem_open("/semB", O_CREAT|O_EXCL, S_IRWXU | S_IRWXG | S_IRWXO, 0); //Initialize semaphore(= 0) for process B
if (fork()){ // parent process
if(fork()){}
else{
sem_t *childsemA = sem_open("/semA", 0);
sem_t *childsemB = sem_open("/semB", 0);
while(1){
printf("A");
sem_post(childsemB);
sem_wait(childsemA);
}
}
}
else{
sem_t *childsemA = sem_open("/semA", 0);
sem_t *childsemB = sem_open("/semB", 0);
while(1){
printf("B"); // child2 process
sem_post(childsemA);
sem_wait(childsemB);
}
}
return 0;
}
输出:
【问题讨论】:
-
如果我没记错的话,信号量旨在与线程(轻量级进程)一起使用,而不是与进程一起使用。 fork 创建一个不共享父级内存的进程,所以我认为您父级的信号量与您孩子的信号量没有交互。
-
@mmeisson:不,OP 正在使用
sem_open()打开命名信号量;这些在进程之间共享。 -
OP,标准 C 库缓冲标准输出。在每个
printf()之后添加fflush(stdout);以使 C 库将字母发送到实际的标准输出。 -
你不需要
childsemA和childsemB,只需要使用父级打开的semA和semB即可。 -
对于奋斗者,不要让您的系统陷入困境,请在父母中使用
wait(0);电话
标签: c process synchronization fork semaphore