Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 消费者-生产者问题_C - Fatal编程技术网

C 消费者-生产者问题

C 消费者-生产者问题,c,C,我的消费者、制作人程序有问题,它似乎加载了,但返回了一个分段错误。我已经尽了一切努力来修复它,但仍然失败!!非常感谢您的帮助。 注;如果有人想测试的话,代码非常多,semaphore.h代码就在其中。代码的其余部分如下所示。我在Unix机器上运行这个 //----------------SEMOPHORE.H-------------------------- /*********************** semaphore.h *********************

我的消费者、制作人程序有问题,它似乎加载了,但返回了一个分段错误。我已经尽了一切努力来修复它,但仍然失败!!非常感谢您的帮助。 注;如果有人想测试的话,代码非常多,semaphore.h代码就在其中。代码的其余部分如下所示。我在Unix机器上运行这个

      //----------------SEMOPHORE.H--------------------------
    /*********************** semaphore.h ****************************/
    #define SEM_NAME "semaphore.h",'a'
    #define SEM_MAX   3
    #define FREE      0
    #define DATA      1
    #define ROOM      2
    #define S_WAIT   -1
    #define S_SIGNAL  1
    #define NO_EVENT -1

    int sem_config(int, int);
    int sem_wait(int, int);
    int sem_signal(int, int);

    //----------------Producer-----------------------
    #include<stdio.h>
    #include"semaphore.h"
    #include"shbuf.h"
    # include <string.h>  
    # include "shbuf.h"  

    void myadd();  

    main()
    {
        sem_config(DATA, FREE);
        myadd();
        sem_signal(DATA,S_SIGNAL);
        return 0;
    }
    void myadd()  
     {  
       char str[80];  
       char discard;  
       printf("you can type a message for the producer."\n);  
       printf("Producing message : ");  
       scanf("%s%c", str, &discard);  
       q_add(strlen(str) , str);  
     }  
    //---------------------------CONSUMER---------------------------
    #include<stdio.h>
    #include"semaphore.h"
    #include"shbuf.h"

    # include <string.h>  
    # include "shbuf.h"  

    void myremove(); 

    main()
    {
    sem_wait(DATA, S_WAIT);
    myremove();
    sem_signal(DATA,S_SIGNAL);

    return 0;
    }

    void myremove()  
     {  
       char str[80];  
       if(q_items() > 0)  
       {  
         q_remove(1 , str);  
         str[1] = 0;  
         printf("%s\n", str);  
       }  
     } 
    //-------------------------------SEMAPHORE.C--------------------------------------
    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/sem.h>
    #include "semaphore.h"

    static  int sem_id;

    static  union semun 
        {
            int val; /* value for SETVAL */
            struct semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */
            ushort array[1]; /* array for GETALL & SETALL, used in setting or retrieving all semaphorevalues in a set.*/
        } sem_attr;

    static  struct sembuf asem[1];
    static  key_t s_key; //key for shared memory

    int sem_config(int event, int init_val)
     {
        int x;
        s_key = ftok(SEM_NAME); //key for semaphore
        //create a semaphore for process synchronization
        if ( -1 == (sem_id = semget(s_key, SEM_MAX, 0666|IPC_CREAT ) ))
        {
            perror("semget");
            return -1;
        }
        if ( event == NO_EVENT )
            return 0;   /*locate semaphore only*/
        //set initial value of semaphore
        sem_attr.val = init_val;
        if ( -1 == semctl(sem_id, event, SETVAL, sem_attr ) )
        {
            perror("semctl SETVAL");
            return -1;
        }
        if ( -1 == ( x = semctl(sem_id, event, GETVAL, sem_attr ) ) )
        {
            perror("semctl GETVAL");
            return -1;
        }
        assert( x == init_val );
        return 0;
     }

    int sem_wait(int event, int nwaits)
    {
        asem[0].sem_num = event;
        asem[0].sem_op = nwaits * S_WAIT;
        asem[0].sem_flg = 0;
        if ( event == NO_EVENT )    /*remove semaphore set*/
            if ( -1 == semctl(sem_id, 0, IPC_RMID, sem_attr ) )
            {
                perror("semctl IPC_RMID");
                return -1;
            }
            else
                return 0;
        if ( -1 == semop(sem_id, asem, 1 ) )
        {
            perror("semop");
            return -1;
        }
        return 0;
    }

    int sem_signal(int event, int nsignals)
     {
        asem[0].sem_num = event;
        asem[0].sem_op = nsignals * S_SIGNAL;
        asem[0].sem_flg = 0;
        if ( event == NO_EVENT )
            if ( -1 == semctl(sem_id, 0, IPC_RMID, sem_attr ) )
            {
                perror("semctl IPC_RMID");
                return -1;
            }
            else
                return 0;
        if ( -1 == semop(sem_id, asem, 1 ) )
        {
            perror("semop");
            return -1;
        }
        return 0;
     }
/------------SEMOPHORE.H--------------------------
/***********************信号量****************************/
#定义SEM_名称“semaphore.h”和“a”
#定义SEM_MAX 3
#定义自由0
#定义数据1
#定义房间2
#定义S_WAIT-1
#定义S_信号1
#定义无_事件-1
int sem_配置(int,int);
int sem_wait(int,int);
int sem_信号(int,int);
//----------------制作人-----------------------
#包括
#包括“semaphore.h”
#包括“shbuf.h”
#包括
#包括“shbuf.h”
void myadd();
main()
{
sem_配置(数据,免费);
myadd();
sem_信号(数据、S_信号);
返回0;
}
void myadd()
{  
char-str[80];
残炭;
printf(“您可以为生产者键入消息。”\n);
printf(“生成消息:”);
scanf(“%s%c”、str和discard);
q_add(strlen(str),str);
}  
//---------------------------消费者---------------------------
#包括
#包括“semaphore.h”
#包括“shbuf.h”
#包括
#包括“shbuf.h”
void myremove();
main()
{
sem_wait(数据,S_wait);
myremove();
sem_信号(数据、S_信号);
返回0;
}
void myremove()
{  
char-str[80];
如果(q_items()>0)
{  
q_移除(1,str);
str[1]=0;
printf(“%s\n”,str);
}  
} 
//-------------------------------信号量--------------------------------------
#包括
#包括
#包括
#包括“semaphore.h”
静态int-sem_-id;
静态联合塞蒙
{
int val;/*SETVAL的值*/
IPC_STAT和IPC_SET的结构semid_ds*buf;/*缓冲区*/
ushort数组[1];/*用于GETALL和SETALL的数组,用于设置或检索集合中的所有信号量值*/
}扫描电镜;
静态结构sembuf asem[1];
静态键\u t s\u键//共享内存的密钥
int sem_配置(int事件,int初始值)
{
int x;
s_key=ftok(SEM_NAME);//信号量的键
//为进程同步创建信号量
如果(-1==(sem_id=semget(s_键,sem_MAX,0666 | IPC_创建)))
{
perror(“semget”);
返回-1;
}
如果(事件==无事件)
返回0;/*仅定位信号量*/
//设置信号量的初始值
sem_attr.val=初始值;
if(-1==semctl(sem_id,event,SETVAL,sem_attr))
{
perror(“semctl SETVAL”);
返回-1;
}
if(-1==(x=semctl(sem\u id,event,GETVAL,sem\u attr)))
{
perror(“semctl GETVAL”);
返回-1;
}
断言(x==init_val);
返回0;
}
int sem_等待(int事件,int nwaits)
{
亚欧会议[0].sem_num=事件;
亚欧会议[0].sem_op=nwaits*S_WAIT;
亚欧会议[0],sem_flg=0;
if(event==NO_event)/*删除信号量集*/
if(-1==semctl(sem\u id,0,IPC\u RMID,sem\u attr))
{
perror(“semctl IPC_RMID”);
返回-1;
}
其他的
返回0;
如果(-1==semop(sem_id,亚欧会议,1))
{
perror(“semop”);
返回-1;
}
返回0;
}
int sem_信号(int事件、int信号)
{
亚欧会议[0].sem_num=事件;
asem[0]。sem_op=nsignals*S_信号;
亚欧会议[0],sem_flg=0;
如果(事件==无事件)
if(-1==semctl(sem\u id,0,IPC\u RMID,sem\u attr))
{
perror(“semctl IPC_RMID”);
返回-1;
}
其他的
返回0;
如果(-1==semop(sem_id,亚欧会议,1))
{
perror(“semop”);
返回-1;
}
返回0;
}

一般来说,调试分段错误的最佳方法是使用
-g
标志编译并在gdb之类的调试器中运行。它将准确地告诉您崩溃的位置,并让您打印出变量的值来告诉您原因。

通常,调试分段错误的最佳方法是使用
-g
标志编译并在gdb之类的调试器中运行。它将准确地告诉您崩溃的位置,并让您打印出变量的值来告诉您原因。

使用调试符号编译。如果使用的是
gcc
,则对大多数符号使用
-g3
标志。您还应该使用
-Wall
标志,并注意它给您的警告。尝试使用调试器单步执行首先失败的程序,并查看失败的位置


我敢打赌问题出在你的
q_remove
q_add
代码上,因为那是你遗漏的代码,而且它可能使用数组。

用调试符号编译。如果使用的是
gcc
,则对大多数符号使用
-g3
标志。您还应该使用
-Wall
标志,并注意它给您的警告。尝试使用调试器单步执行首先失败的程序,并查看失败的位置


我打赌问题出在你的
q_remove
q_add
代码上,因为这是你漏掉的代码,而且它可能使用数组。

你能解释一下什么特别失败吗?你哪里出了错?您可以尝试在代码中插入
printf