编程语言C
下面是使用多线程打印文件的代码。没有错误,但是代码无法正常工作。然而,编译时它会显示此警告 5 次:
'从指针转换为不同大小的整数'
我已经尝试了所有我能想到的方法来解决这个问题,但没有成功,现在只是在黑暗中拍摄。有人看到我的错误在哪里吗?我们非常感谢任何帮助,并将很乐意根据要求提供任何其他信息。
谢谢。
#include <sys/mman.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#define NUM_THREAD 4
struct fileParams {
int fd;
int size;
};
void *printFile(void *stuff)
{
struct fileParams *params = stuff;
int addr;
addr=(unsigned char *)mmap(NULL, (int) ¶ms->size, PROT_READ,
MAP_PRIVATE,(int) ¶ms->fd,0);
write(STDOUT_FILENO, addr, (int)¶ms->size);
}
int main (int argc, char * argv[])
{
pthread_t threads[NUM_THREAD];
unsigned char *addr;
int fd,rc;
struct stat sb;
int numCPU=sysconf(_SC_NPROCESSORS_ONLN);
struct fileParams params;
printf("Number of aviable cores: %d\n",numCPU);
printf("Using 4 processors\n");
if (argc != 2 || strcmp(argv[1], "—help") == 0)
printf("Usage: %s file\n", argv[0]);
fd=open(argv[1],O_RDONLY);
if (fd == -1)
{
printf("File open fdailed.\n");
exit(EXIT_FAILURE);
}
if (fstat(fd, &sb) == -1)
{
printf ("fstat error\n");
exit(EXIT_FAILURE);
}
params.fd=fd;
params.size=sb.st_size/4;
for (int n = 0; n<4; n++)
rc=pthread_create(&threads[n],NULL,printFile,¶ms);
exit(EXIT_SUCCESS);
}
最佳答案
您需要为与函数匹配的函数提供输入 - 在需要整数的地方传递指针(或相反)将生成警告或错误,具体取决于编译选项。
mmap 将 size_t 作为第二个参数,但您将其转换为指针 (¶ms->size),与 mmaps 第 5 个参数相同。
去掉“&”,这样它只是一个整数。
mmap 还返回一个 void *,然后将其分配给 addr(一个 int)。
将 int 更改为 void * 指针类型,这也应该修复第五个警告。
关于C pthreads错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45358923/