История изменений
Исправление
Moisha_Liberman,
(текущая версия)
:
#include <stdio.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char *argv[]){
const char *which_file = argv[1];
struct stat buff;
/* Открываем файл на чтение и определяем его размер. */
int fd = open(which_file, O_RDONLY);
if(fd < 0) {
fprintf(stderr, "Can't open \"%s \"\n", which_file);
exit(1);
}
int err = fstat(fd, &buff);
if(err < 0) {
fprintf(stderr,"Can't open\"%s \"\n", which_file);
exit(2);
}
/* Мапим файл с уже понятным размером. */
char *ptr = mmap(NULL, buff.st_size, PROT_READ,
MAP_SHARED, fd, 0);
if(ptr == MAP_FAILED) {
fprintf(stderr, "Mapping failed\n");
exit(3);
}
close(fd); /* Файл считан, fd закрыли, больше не нужен */
/* Выводим на экран ранее отмапленное. */
ssize_t n = write(STDOUT_FILENO, ptr, buff.st_size);
if(n != buff.st_size){
fprintf(stderr, "%s\n", "Write failed");
}
/* На таком коротком примере этого можно не делать, т.к.
* при выходе из приложения система за нами всё зачистит,
* но пусть будет чисто иллюстрации ради.
*/
err = munmap(ptr, buff.st_size);
if(err != 0){
fprintf(stderr, "%s\n", "Unmapping failed");
exit(4);
}
return 0;
}
Я тут выставил всякие exit()
с разными кодами выхода чтобы в шелл-скрипте можно было бы посмотреть состояние и выяснить где именно отвалилось и на каком этапе. Можно игнорировать или просто возвращать ошибку через return -1
, это не важно в итоге.
В общем, примерно как-то так. Ну и вывод на экран содержимого файла это демонстрация как не вываливаться за пределы отмапленного файла.
Удачи.
Спасибо!
Не за что. =)
Исправление
Moisha_Liberman,
:
#include <stdio.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char *argv[]){
const char *which_file = argv[1];
struct stat buff;
/* Открываем файл на чтение и определяем его размер. */
int fd = open(which_file, O_RDONLY);
if(fd < 0) {
fprintf(stderr, "Can't open \"%s \"\n", which_file);
exit(1);
}
int err = fstat(fd, &buff);
if(err < 0) {
fprintf(stderr,"Can't open\"%s \"\n", which_file);
exit(2);
}
/* Мапим файл с уже понятным размером. */
char *ptr = mmap(NULL, buff.st_size, PROT_READ,
MAP_SHARED, fd, 0);
if(ptr == MAP_FAILED) {
fprintf(stderr, "Mapping failed\n");
exit(3);
}
close(fd); /* Файл считан, fd закрыли, больше не нужен */
/* Выводим на экран ранее отмапленное. *|
ssize_t n = write(STDOUT_FILENO, ptr, buff.st_size);
if(n != buff.st_size){
fprintf(stderr, "%s\n", "Write failed");
}
/* На таком коротком примере этого можно не делать, т.к.
* при выходе из приложения система за нами всё зачистит,
* но пусть будет чисто иллюстрации ради.
*/
err = munmap(ptr, buff.st_size);
if(err != 0){
fprintf(stderr, "%s\n", "Unmapping failed");
exit(4);
}
return 0;
}
Я тут выставил всякие exit()
с разными кодами выхода чтобы в шелл-скрипте можно было бы посмотреть состояние и выяснить где именно отвалилось и на каком этапе. Можно игнорировать или просто возвращать ошибку через return -1
, это не важно в итоге.
В общем, примерно как-то так. Ну и вывод на экран содержимого файла это демонстрация как не вываливаться за пределы отмапленного файла.
Удачи.
Спасибо!
Не за что. =)
Исправление
Moisha_Liberman,
:
#include <stdio.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char *argv[]){
const char *which_file = argv[1];
struct stat buff;
/* Открываем файл на чтение и определяем его размер. */
int fd = open(which_file, O_RDONLY);
if(fd < 0) {
fprintf(stderr, "Can't open \"%s \"\n", which_file);
exit(1);
}
int err = fstat(fd, &buff);
if(err < 0) {
fprintf(stderr,"Can't open\"%s \"\n", which_file);
exit(2);
}
/* Мапим файл с уже понятным размером. */
char *ptr = mmap(NULL, buff.st_size, PROT_READ,
MAP_SHARED, fd, 0);
if(ptr == MAP_FAILED) {
fprintf(stderr, "Mapping failed\n");
exit(3);
}
close(fd); /* Файл считан, fd закрыли, больше не нужен */
ssize_t n = write(STDOUT_FILENO, ptr, buff.st_size);
if(n != buff.st_size){
fprintf(stderr, "%s\n", "Write failed");
}
err = munmap(ptr, buff.st_size);
if(err != 0){
fprintf(stderr, "%s\n", "Unmapping failed");
exit(4);
}
return 0;
}
Я тут выставил всякие exit()
с разными кодами выхода чтобы в шелл-скрипте можно было бы посмотреть состояние и выяснить где именно отвалилось и на каком этапе. Можно игнорировать или просто возвращать ошибку через return -1
, это не важно в итоге.
В общем, примерно как-то так. Ну и вывод на экран содержимого файла это демонстрация как не вываливаться за пределы отмапленного файла.
Удачи.
Спасибо!
Не за что. =)
Исходная версия
Moisha_Liberman,
:
Да, как-то вот так:
#include <stdio.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char *argv[]){
const char *which_file = argv[1];
struct stat buff;
/* Открываем файл на чтение и определяем его размер. */
int fd = open(which_file, O_RDONLY);
if(fd < 0) {
fprintf(stderr, "Can't open \"%s \"\n", which_file);
exit(1);
}
int err = fstat(fd, &buff);
if(err < 0) {
fprintf(stderr,"Can't open\"%s \"\n", which_file);
exit(2);
}
/* Мапим файл с уже понятным размером. */
char *ptr = mmap(NULL, buff.st_size, PROT_READ,
MAP_SHARED, fd, 0);
if(ptr == MAP_FAILED) {
fprintf(stderr, "Mapping failed\n");
exit(3);
}
close(fd); /* Файл считан, fd закрыли, больше не нужен */
ssize_t n = write(STDOUT_FILENO, ptr, buff.st_size);
if(n != buff.st_size){
fprintf(stderr, "%s\n", "Write failed");
}
err = munmap(ptr, buff.st_size);
if(err != 0){
fprintf(stderr, "%s\n", "Unmapping failed");
exit(4);
}
return 0;
}
Я тут выставил всякие exit()
с разными кодами выхода чтобы в шелл-скрипте можно было бы посмотреть состояние и выяснить где именно отвалилось и на каком этапе. Можно игнорировать или просто возвращать ошибку через return -1
, это не важно в итоге.
В общем, примерно как-то так. Ну и вывод на экран содержимого файла это демонстрация как не вываливаться за пределы отмапленного файла.
Удачи.