raz*_*eLe 0 c linux operating-system
我正在研究有关生产者 - 消费者问题的程序(来自我的OS类),当我编译它时,我遇到了这个oroblem:
razrlele@razrlele-ThinkPad:~/work/os$ gcc producerconsumer.c -lpthread -o producerconsumer
/tmp/ccyFGuJk.o: In function `main':
producerconsumer.c:(.text+0xb8): undefined reference to `err_quit'
producerconsumer.c:(.text+0xfc): undefined reference to `err_quit'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我想知道err_quit的定义在哪里?
我的操作系统是Ubuntu-gnome 14.04,这是我的整个程序代码:
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <semaphore.h>
4 #include <pthread.h>
5 #include <stdlib.h>
6
7 void *producer_handler(void *ptr);
8 void *consumer_handler(void *ptr);
9
10 sem_t mutex, blank, fill;
11 int *buffer;
12 int in = 0, out = 0, buffer_size = 10;
13
14 int main()
15 {
16 if((buffer = (int *)malloc(buffer_size *sizeof(int))) == NULL)
17 printf("can't allocate memory on heap\n");
18 sem_init(&mutex, 0, 1);
19 sem_init(&blank, 0, buffer_size);
20 sem_init(&fill, 0, 0);
21
22 int err;
23 pthread_t producer, consumer;
24 err = pthread_create(&producer, NULL, producer_handler, NULL);
25 if(err != 0)
26 err_quit("can't create thread: %s\n", strerror(err));
27 err = pthread_create(&consumer, NULL, consumer_handler, NULL);
28 if(err != 0)
29 err_quit("can't create thread: %s\n", strerror(err));
30
31 sleep(10);
32 return 0;
33 }
34
35 void *producer_handler(void *ptr)
36 {
37 while(1)
38 {
39 static int data = 0;
40 sem_wait(&blank);
41 sem_wait(&mutex);
42
43 buffer[in] = ++data;
44 printf("%d has been input to the buffer\n", data);
45 in = (in + 1 + buffer_size)%buffer_size;
46 sem_post(&mutex);
47 sem_post(&fill);
48 sleep(1);
49 }
50 return ((void *) 0);
51 }
52
53 void *consumer_handler(void *ptr)
54 {
55 while(1)
56 {
57 int fetch;
58 sem_wait(&fill);
59 sem_wait(&mutex);
60 fetch = buffer[out];
61 out = (out + 1 + buffer_size)%buffer_size;
62 printf("%d has been fetched\n", fetch);
63 sem_post(&mutex);
64 sem_post(&blank);
65 sleep(2);
66 }
67 return ((void *) 0);
68 }
69
Run Code Online (Sandbox Code Playgroud)
派对迟到了,但也许有人会发现它很有用.
err_quit不是标准的C函数.最有可能的是,您的操作系统教师使用了UNIX环境中的高级编程代码.这是第三版的源代码.err_quit定义在include/apue.h,实现在lib/error.c.