Citat:
Mikky je napisao:
e sad ti meni reci
gde si naucio tu proceduru da to uradis
mislim, kada bi meni neko trazio to da uradim ja ne bi imao pojma da trebam prvo da "mapiram fajl u memoriji" i ostalo.....isto tako i kod drugih stvari kao npr. rad sa socketima....treba prvo da kreiras pa da otvoris socket pa da bindujes itd.....
Za pocetak o net programiranju i socketima mozes pogledati ovo:
http://nonenone.2y.net/download/network_programming_tutorial.tgz
Onda mozes da potrazis i
An Advanced 4.4BSD Interprocess Communication Tutorial
Zatim ako oces da se nadjemo u gradu pa da ti dam Advanced programming in UNIX environment...
Imas tu jako dobro poglavlje o signalima (ja sam odatle naucio dosta o primeni/koristi signala),onda imas mmap(),syslog(),open,write/read i gomilu ostalih funkcija...stvarno knjiga koja pokriva sve o UNIX programiranju...
Citat:
takodje koja je razlika izmedju tog mapiranja i alociranja?
Pa alociranje je dobavljanje memorije sa malloc,realloc,calloc i sl...
A ovo mapiranje bi mogao da definisem sa recimo podizanje fajla u memoriju ;o) ili obuhvatanjem jednog dela memorije za moje potrebe ;o)
Ako se nevaram malloc i srodne funkcije preko sbrk() i brk() pokusavaju da alociraju memoriju u data segmentu.
Ovde se pravi razlika jel je mmap() syscall koji sluzi bas za (po srpski) postavljanje filea u memoriju tako da sa njegovim sadrzajem mozes da opstis kao i svakim drugim pointerom.
Ne znam u kom delu memorije se nalazi alocirana memorija sa mmap() ali to nije ni bitno ako se ne bavis kernel hackingom ;o)
Pogledaj ovaj kod de se iz fajla u fajl kopira tako sto dva fajla se mapiraju u memoriji i onda sa memcpy() se kopira:
Code:
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdio.h>
#ifndef MAP_FILE
#define MAP_FILE 0
#endif
int main(int argc,char **argv){
int fd,fd1;
void *file1,*file2;
struct stat buf;
mode_t mode;
if (argc!=3){
printf("Usage %s <src file> <dst file>\n",argv[0]);
exit(1);
}
stat(argv[1],&buf);
mode=buf.st_mode;
fd=open(argv[1],O_RDONLY);
fd1=open(argv[2],O_CREAT|O_TRUNC|O_RDWR,mode);
lseek(fd1,buf.st_size-1,SEEK_SET);
write(fd1,"",1);
file1=mmap(0,buf.st_size,PROT_READ,MAP_SHARED,fd,0);
file2=mmap(0,buf.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd1,0);
printf(" copying from %p to %p\n",file1,file2);
memcpy(file2,file1,buf.st_size);
exit(0);
}
Citat:
2 pitanje, sta je file descriptor?
Najobicniji int koji se vrne posle uspesnog open(),mkstemp(),socket() itd...to bi trebalo da predstavlja univerzalni broj u okviru programa kojim bi se identifikovao taj otvoren file(sve je na UNIXu file)
Citat:
3 kako ti definises stream, tj kako ga ti kapiras posto samo programiranje je puno apstraktnih pojmova i treba vremena da se te stvari iskristalishu u glavi......barem kod mene
Pa stream prevashodno shvatam kao FILE * ;o) mozda on ima neko levo znacenje ali ja ga ovako shvatam jel se kaze u man za printf :
Printf() and vprintf() write output to stdout, the
standard output stream; fprintf() and vfprintf() write output to the giv-
en output stream;
A FILE struktura opet ima jednog clana koji na UNIXu pokazuje na fd,(mozda je tako i na DOSu)