c-分段故障和信号量工作不正常



我一直在为学校做这项作业,要求我制作一个总共使用3个进程的程序,并使用信号量从0计数到参数maxnum指定的数字,在两个孩子被分叉后,必须从main中初始化该参数,进程必须以main执行数字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 1n");
            ++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 2n");
        ++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;
}

我刚刚修复了我的程序,使其正常工作,我又创建了两个SEM_NAME定义,并用它们来存储sem2和sem3。我将while循环改为dowhile循环,并删除了大部分sem_post调用,现在它可以正常工作了。

相关内容

  • 没有找到相关文章

最新更新