LINUX.ORG.RU

История изменений

Исправление 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, это не важно в итоге.

В общем, примерно как-то так. Ну и вывод на экран содержимого файла это демонстрация как не вываливаться за пределы отмапленного файла.

Удачи.