我想创建一个共享内存和信号量的C程序。应该有两个子进程。两个孩子都有一个不同的int数。然后有一个目标号码,应该写在共享内存中。现在两个孩子都应该从进球数中减去他们的数字,直到进球数低于或等于0。我不希望出现比赛条件。这就是为什么我尝试使用信号量。但对我没用。下面是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include <errno.h>
#include <sys/sem.h>
#define SEG_SIZE sizeof(int)
#define NUM_OF_CHILDS 2
int main(int argc, char *argv[]){
int i, shm_id, sem_id, *shar_mem;
int pid[NUM_OF_CHILDS];
long waittime = 100;
unsigned short marker[1];
/* Define the numbers and the goal number */
int numbers[2] = {28, 23};
int goal = (numbers[0] + numbers[1]) * 4;
/* Create semaphor */
if((sem_id = semget(IPC_PRIVATE, 1, IPC_CREAT|0644)) == -1){
perror("semget()");
exit(EXIT_FAILURE);
}
marker[0] = 1;
/* All sem's to 1 */
semctl(sem_id, 1, SETALL, marker);
/* Create shared memory */
if((shm_id = shmget(IPC_PRIVATE, SEG_SIZE, IPC_CREAT|0600)) == -1){
perror("shmget()");
exit(EXIT_FAILURE);
}
if((shar_mem = (int *)shmat(shm_id, 0, 0)) == (int *) -1){
perror("shmat()");
exit(EXIT_FAILURE);
}
*shar_mem = goal;
/* Create child processes */
for(i = 0; i < NUM_OF_CHILDS; i++){
pid[i] = fork();
if(pid[i] < 0){
printf("Error!\n");
exit(1);
}
if(pid[i] == 0){
int count = 0;
/* Child processes */
/* Structs for semaphor */
struct sembuf enter, leave;
enter.sem_num = leave.sem_num = 0;
enter.sem_flg = leave.sem_flg = SEM_UNDO;
enter.sem_op = -1; /* DOWN-Operation */
leave.sem_op = 1; /* UP-Operation */
/* Join critical area */
semop(sem_id, &enter, 1);
while(*shar_mem > 0){
usleep(waittime);
*shar_mem -= numbers[i];
count++;
}
printf("%i\n", count);
/* Leave critical area */
semop(sem_id, &leave, 1);
exit(0);
}
}
/* Wait for childs. */
for(i = 0; i < NUM_OF_CHILDS; i++){
waitpid(pid[i], NULL, 0);
}
/* Is goal equal 0 or lower? */
int returnv;
if(*shar_mem == 0){
/* No race conditions */
returnv = 0;
}
else {
/* Race conditions */
returnv = 1;
}
/* Close shared memory and semaphores */
shmdt(shar_mem);
shmctl(shm_id, IPC_RMID, 0);
semctl(sem_id, 0, IPC_RMID);
return returnv;
}
将while循环调整为如下所示,以便在减去一次后离开临界部分:
for ( ; ; ) {
usleep(waittime);
semop(sem_id, &enter, 1);
if (*shar_mem <= 0) {
semop(sem_id, &leave, 1);
break;
}
*shar_mem -= numbers[i];
semop(sem_id, &leave, 1);
count++;
}
但正如我在评论中所说的,不能保证两个孩子交替减去他们的数字,也就是说,结果可能小于零
代码是:
程序应该创建200000个整数,并将2000个写入共享内存。分叉进程应该从共享内存中读取2000,父进程应该将下一个2000写入共享内存。 请帮帮我们谢谢你们 编辑:非常感谢您的回答。我不能标出正确的答案,因为我不知道什么是正确的。但我不想再尝试了。15个小时就够了
我尝试编写一个共享内存和信号量程序,该程序一直运行到按下Ctrl+C,即接收到: 当按下Ctrl+C时,被设置为,它会跳出循环并退出。在没有共享内存和信号量的情况下,这可以很好地工作,但是在这里,我从来没有在上获得字符串,只捕获并且它继续运行。 为什么?
我需要编写一个程序,它正在创建N个数量的子进程,每一个进程都将一个添加到共享内存变量中。我的想法是使用信号量和共享内存,但进程之间并没有相互等待,共享内存变量也没有像我希望的那样工作。 MyDefs.H Main.C 奴隶Proc.c
null 有3个信号量:互斥-初始化为1满-初始化为0空-初始化为n(而n是管道中的“字节”数) 消费者代码: 生产者代码: 如有任何帮助,不胜感激,谢谢!