我一直致力于学校的这项任务,要求我制作一个总共使用3个进程的程序,并使用信号量从0计数到由参数maxnum指定的数字,该数字必须从在两个孩子被分叉之后的主要内部,并且进程必须以这样的方式打印出数字,即主要数字0,3,6,第一个孩子1,4,7和第二个孩子2,5,8当我的代码到达我的代码中的第一个sem_post()命令时,我一直在弄清楚为什么我的代码会给我分段错误。我让我的代码在某个时刻运行,但是当它运行时,进程打印出数字的顺序总是完全随机的,并且永远不会接近我需要的正确顺序。我一直在删除失败后的垃圾信号量,以消除这个问题。非常感谢您对此问题的任何帮助。
请注意,printfs就在那里,所以我知道他们发布了哪个订单,并且对我的代码可能有多乱来感到抱歉。
#include <stdio.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <semaphore.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <sys/stat.h>
#define SEM_NAME "/test.mutex"
sem_t *sem1;
sem_t *sem2;
sem_t *sem3;
int main(int argc, char *argv[]){
sem1 = sem_open(SEM_NAME, O_CREAT, O_RDWR, 1);
if(sem1 == (void *)-1){
perror("sem_open() failed ");
}
sem2 = sem_open(SEM_NAME, O_CREAT, O_RDWR, 0);
if(sem2 == (void *)-1){
perror("sem_open() failed ");
}
sem3 = sem_open(SEM_NAME, O_CREAT, O_RDWR, 0);
if(sem3 == (void *)-1){
perror("sem_open() failed ");
}
int *curnum;
int *maxnum;
const int segment_size = 4096;
int segment_id = shmget(IPC_PRIVATE, segment_size,S_IRUSR|S_IWUSR);
curnum = (int *) shmat(segment_id, NULL, 0);
maxnum = curnum + 1;
if(fork()){
if(fork()){
*maxnum = atoi(argv[1]);
sem_wait(sem1);
while(*curnum <= *maxnum){
printf("%d", *curnum);
printf(" Main \n");
++curnum[0];
sem_post(sem2);
sem_wait(sem1);
}
printf("Exiting Main Loop");
sem_post(sem2);
wait();
shmctl(segment_id, IPC_RMID, NULL);
}
else{
sem_wait(sem3);
while(*curnum <= *maxnum){
printf("%d", *curnum);
printf(" Child 1\n");
++curnum[0];
sem_post(sem1);
sem_wait(sem3);
}
printf("Exiting Child 1 Loop");
sem_post(sem1);
}
}
else{
sem_wait(sem2);
while(*curnum <= *maxnum){
printf("%d", *curnum);
printf(" Child 2\n");
++curnum[0];
sem_post(sem3);
sem_wait(sem2);
}
printf("Exiting Child 2 Loop");
sem_post(sem3);
}
sem_close(sem1);
sem_close(sem2);
sem_close(sem3);
sem_unlink(SEM_NAME);
/* remove shared memory segment */
//shmctl(segment_id, IPC_RMID, NULL);
return 0;
}
答案 0 :(得分:0)
我刚刚修复了我的程序以便它正常工作,我创建了两个SEM_NAME定义并使用它们来存储sem2和sem3。我更改了while循环以执行while循环,并删除了大部分sem_post调用,现在它正常工作。