我正在学习有关生产者-消费者问题的程序(来自我的OS类),当我编译它时,我会遇到这样的问题:
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我想知道err_quit是在哪里定义的?
我的操作系统是Ubuntu 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 发布于 2014-06-03 09:04:14
没有名为err_quit()的标准函数。你为什么决定用它?
它看起来不太像,所以实现的一个想法可能是:
void err_quit(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vfprintf(stderr, fmt, args);
va_end(args);
exit(EXIT_FAILURE);
}当然,这只是基于函数的名称和使用模式的猜测。
发布于 2015-09-05 08:47:13
派对迟到了,但也许有人会觉得它有用。
err_quit不是一个标准的C函数。很可能,您的操作系统老师使用了来自UNIX环境下的高级编程的代码。这里是第三版的源代码。err_quit是用include/apue.h定义的,实现是在lib/error.c中定义的。
发布于 2018-03-19 10:23:07
err_quit()不是一个标准的系统函数,而是一个在控制台上打印的简单错误例程。要获得更多信息,您可以在UNIX环境书附录B部分中查看高级编程。
https://stackoverflow.com/questions/24011090
复制相似问题