wiliam
unread,Mar 23, 2009, 3:17:16 AM3/23/09Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to 西邮Linux兴趣小组
今天替朋友写了一个生产者消费者作业,但出现下面的问题,请各位看一下。
comsumer.c:(.text+0x10): undefined reference to `sem_wait'
comsumer.c:(.text+0x1c): undefined reference to `sem_wait'
comsumer.c:(.text+0x69): undefined reference to `sem_post'
comsumer.c:(.text+0x75): undefined reference to `sem_post'
/tmp/ccI4QZLp.o: In function `productor':
comsumer.c:(.text+0xa3): undefined reference to `sem_wait'
comsumer.c:(.text+0xaf): undefined reference to `sem_wait'
comsumer.c:(.text+0xf6): undefined reference to `sem_post'
comsumer.c:(.text+0x102): undefined reference to `sem_post'
/tmp/ccI4QZLp.o: In function `main':
comsumer.c:(.text+0x1ac): undefined reference to `sem_init'
comsumer.c:(.text+0x1c8): undefined reference to `sem_init'
comsumer.c:(.text+0x1e4): undefined reference to `sem_init'
comsumer.c:(.text+0x236): undefined reference to `pthread_create'
comsumer.c:(.text+0x27f): undefined reference to `pthread_create'
comsumer.c:(.text+0x2b9): undefined reference to `pthread_join'
comsumer.c:(.text+0x2cc): undefined reference to `pthread_join'
comsumer.c:(.text+0x2df): undefined reference to `pthread_join'
comsumer.c:(.text+0x2f2): undefined reference to `pthread_join'
collect2: ld returned 1 exit status
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/stat.h>
#define FIFO "myfifo"
#define N 5
sem_t mutex,avail,full;
int fd;
time_t end_time;
char buf[100];
int lock_var;
//两个生产者线程和两个消费者线程
void productor(void *arg);
void consumer(void *arg);
int main(int argc,char *argv[]){
pthread_t id[4];
int i;
pthread_attr_t attr;
end_time=time(NULL)+30;
if((mkfifo(FIFO,O_CREAT|O_EXCL))<0){
perror("mkfifo");
exit(-1);
}
fd=open(FIFO,O_RDWR|O_NONBLOCK,0);
sem_init(&mutex,0,1);
sem_init(&avail,0,N);
sem_init(&full,0,0);
pthread_attr_init(&attr);
pthread_attr_setscope(&attr,PTHREAD_SCOPE_SYSTEM);
pthread_attr_setscope(&attr,PTHREAD_CREATE_DETACHED);
for(i=0;i<2;i++)
if(pthread_create(&id[i],&attr,(void *)productor,NULL)<0){
perror("pthread_create");
exit(-2);
}
while(i<4){
if(pthread_create(&id[i],&attr,(void *)consumer,NULL)<0){
perror("pthread_create");
exit(-2);
}
i++;
}
pthread_join(id[0],NULL);
pthread_join(id[1],NULL);
pthread_join(id[2],NULL);
pthread_join(id[3],NULL);
return(0);
}
void productor(void *arg){
int n;
while(time(NULL)<end_time){
sem_wait(&avail);
sem_wait(&mutex);
if((n=write(fd,"hello",5))<0)
perror("write");
else
printf("write hello to the FIFO\n");
sem_post(&full);
sem_post(&mutex);
}
}
void consumer(void *arg){
int n;
while(time(NULL)<end_time){
sem_wait(&avail);
sem_wait(&mutex);
if((n=read(fd,buf,100))<0)
perror("read");
printf("read from the FIFO:%s\n",buf);
sem_post(&full);
sem_post(&mutex);
sem_post(&mutex);
}
}