Конфликт типов ошибок и указатель из целого числа без предупреждения приведения C - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь изучать программы чтения / записи на C, и я нашел в Интернете пример, который, как мне показалось, мне следует начать изучать.Когда я попытался скомпилировать код, я получил несколько предупреждений и одну ошибку, подобную этой:

read.c:21:8: error: conflicting types for ‘write’
 void * write(void *temp) {
        ^
In file included from read.c:11:0:
/usr/include/unistd.h:369:16: note: previous declaration of ‘write’ was here
 extern ssize_t write (int __fd, const void *__buf, size_t __n) __wur;
                ^
read.c: In function ‘write’:
read.c:25:4: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
 ret=pthread_rwlock_wrlock(&rwlock);
    ^
read.c: In function ‘write_2’:
read.c:45:4: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
 ret=pthread_rwlock_wrlock(&rwlock);
    ^
read.c: At top level:
read.c:106:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
 main() {

Я все еще плохо знаком с программированием на C и не мог понять, как получить эти предупреждения иошибка решена, так как я просто прыгнул в эту тему, не зная языка слишком хорошо.Вот код, который я пытаюсь скомпилировать.

#include <stdio.h> 
#include <pthread.h> 
#include <stdlib.h>
#include <unistd.h>

/*
From the output we can see that the two writes were executed one after the other. But in case of reads, even though read_1 had not unlocked the rwlock, read_2 was allowed into the critical section and read the file. That shows us that multiple readers are allowed but only one writer is allowed into the critical section. 
*/
pthread_rwlock_t rwlock; // allows multiple readers to access the resource, but only one reader at any given time.




void * write(void *temp) {
char *ret;
FILE *file1;
char *str;
ret=pthread_rwlock_wrlock(&rwlock);
printf("\nFile locked, please enter the message \n");
str=(char *)malloc(10*sizeof(char));
file1=fopen("temp","w");
scanf("%s",str);
fprintf(file1,"%s",str);
fclose(file1);
pthread_rwlock_unlock(&rwlock);
printf("\nUnlocked the file you can read it now \n");
return ret;
}




void * write_2(void *temp) {
char *ret;
FILE *file1;
char *str;
sleep(3);
ret=pthread_rwlock_wrlock(&rwlock);
printf("\nFile locked, please enter the message \n");
str=(char *)malloc(10*sizeof(char));
file1=fopen("temp","a");
scanf("%s",str);
fprintf(file1,"%s",str);
fclose(file1);
pthread_rwlock_unlock(&rwlock);
printf("\nUnlocked the file you can read it now \n");
return ret;
}





void * read_1(void *temp) {
char *ret;
FILE *file1;
char *str;
sleep(5);
pthread_rwlock_rdlock(&rwlock);
printf("\n1 Opening file for reading\n");
file1=fopen("temp","r");
str=(char *)malloc(10*sizeof(char));
fscanf(file1,"%s",str);
printf("\nMessage from file is %s \n",str);
sleep(3);

fclose(file1);
printf("\nUnlocking rwlock\n");
pthread_rwlock_unlock(&rwlock);
return ret;
}





void * read_2(void *temp) {
char *ret;
FILE *file1;
char *str;
sleep(6);
pthread_rwlock_rdlock(&rwlock);
printf("\n2 Opening file for reading\n");
file1=fopen("temp","r");
str=(char *)malloc(10*sizeof(char));
fscanf(file1,"%s",str);
printf("\nMessage from file is %s \n",str);

fclose(file1);

pthread_rwlock_rdlock(&rwlock);

return ret;
}




main() {

pthread_t thread_id,thread_id1,thread_id3,thread_id4;
pthread_attr_t attr;
int ret;
void *res;
pthread_rwlock_init(&rwlock,NULL);
ret=pthread_create(&thread_id,NULL,&write,NULL);
ret=pthread_create(&thread_id1,NULL,&read_1,NULL);

ret=pthread_create(&thread_id3,NULL,&read_2,NULL);

ret=pthread_create(&thread_id4,NULL,&write_2,NULL);
printf("\n Created thread");
pthread_join(thread_id,&res);
pthread_join(thread_id1,&res);
pthread_join(thread_id3,&res);

pthread_join(thread_id4,&res);
pthread_rwlock_destroy(&rwlock);
}

Вопрос в том, почему эти предупреждения и эта ошибка появляются для этого кода?

PS не знаю почему, но когда я пытаюсь запустить его после получения этих предупреждений и ошибок, он все равно работает так, как я думал.Это довольно странно.Спасибо за чтение.

1 Ответ

0 голосов
/ 11 декабря 2018

write - это имя системного вызова. объявление для функции присутствует в <unistd.h>, который вы включили в свою программу на C.

Ваша программа на C продолжает работать, потому что вы нигде не используете фактический write системный вызов;стандартная библиотека C использует его, но она связана со статической функцией other write.


Что касается других предупреждений,

main()

не совсем правильно.Он должен иметь прототип int main(void) или int main(int argc, char *argv[]).

. Для pthread_* функций вы должны #include <pthread.h>.

Возвращаемое значение pthread_rwlock_wrlock это не указатель, но int, поэтому вы должны назначить его объекту типа int, но вы присваиваете его ret типа char *


В общем, вам следует включить все общие полезные средства диагностики в компиляторе C (-Wall) и считать каждое предупреждение ошибкой (-Werror).


Наконец,все командные строки компиляции и компоновки должны иметь флаг -pthread.

...