Приветствую. Накидал такой код:
void* fileMem, *pos;
int fd, res;
long int flen, fpos;
size_t i,o,p;
fd = open( "myfile.txt", O_RDONLY );
if( fd < 0 )
exit(1);
flen = lseek64( fd, 0, SEEK_END );
if( -1 == flen ){
perror("llseek(): ");
exit(1);
}
lseek64( fd, 0, SEEK_SET );
fileMem = mmap( 0, pageLimit, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0 );
if( fileMem == MAP_FAILED ){
perror("llseek(): ");
exit(1);
}
memset( fileMem, 'a', pageLimit );
//fileMem = mremap(fileMem, pageLimit, pageLimit*2, 1 ); //Incorrect pointer
fileMem = syscall(SYS_mremap, fileMem, pageLimit, pageLimit*2, 1 ); //Correct pointer
if( fileMem == MAP_FAILED ){
switch(errno){
case ENOMEM:
printf("NO memory\n");
break;
case EINVAL:
printf("Invalid args\n");
break;
}
perror("mremap(): ");
exit(1);
}
memset( fileMem + pageLimit, 'b', pageLimit );
write( 1, fileMem, pageLimit*2 );
p.s. компилятор ругается на оба способа вызова mremap() так: "warning: assignment makes pointer from integer without a cast" p.p.s. список всех заголовков в коде:
#define _LARGEFILE64_SOURCE
#include <stdio.h> //printf
#include <linux/sched.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <sys/select.h>
#include <sys/time.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <limits.h>
#include <errno.h>
#include <error.h>
#include <signal.h>
#include <sys/mman.h>
#include <resolv.h>
#include <netdb.h>
#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <openssl/pem.h>
#include <openssl/x509.h>
#include <openssl/x509_vfy.h>