# 作業系統實驗 Lab14

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<sys/mman.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#define FILE_LENGTH 10000

int main(int argc,char *argv[])
{
    if(argc!=2)
    {
        printf("Usage: %s filename\n",argv[0]);
        return 0;
    }
    int fd,count=0;
    char *map_memory,*ca;
    
    fd = open(argv[1], O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
    
    lseek(fd, FILE_LENGTH+1, SEEK_SET);
    write(fd, "", 1);
    lseek(fd, 0, SEEK_SET);
    map_memory =(char*) mmap(0, FILE_LENGTH, PROT_WRITE, MAP_SHARED, fd, 0);
    close(fd);
    
    ca = map_memory;
    while( FILE_LENGTH>count && fgets(ca,FILE_LENGTH-count,stdin)!=NULL )
    {
        int tmp = strlen(ca);
        count += tmp;
        ca += tmp;
    }
    
    munmap(map_memory, FILE_LENGTH);
    return 0;
}
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<sys/mman.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#define FILE_LENGTH 10000

int main(int argc,char *argv[])
{
    if(argc!=4)
    {
        printf("Usage: %s filename start_pos end_pos\n",argv[0]);
        return 1;
    }
    int start_pos=0, end_pos=0;
    start_pos = atoi(argv[2]);
    end_pos = atoi(argv[3]);
    if(start_pos<0 || end_pos>FILE_LENGTH || start_pos>end_pos)
    {
        puts("start_pos or end_pos error. Please try again.");
        return 1;
    }
    int fd,i;
    char *map_memory;
    
    fd = open(argv[1], O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
    
    lseek(fd, FILE_LENGTH+1, SEEK_SET);
    write(fd, "", 1);
    lseek(fd, 0, SEEK_SET);
    map_memory =(char*) mmap(0, FILE_LENGTH, PROT_WRITE, MAP_SHARED, fd, 0);
    close(fd);
    
    printf("Substring from [%d] to [%d] is: ",start_pos,end_pos);
    for(i=start_pos-1;i<end_pos;i++)
        printf("%c",*(map_memory+i));
    puts("");
    
    munmap(map_memory, FILE_LENGTH);
    return 0;
}