Exemplu de comunicare intre programe la nivel de fisier

Programul urmator (bin_blkw.c) foloseste citirea si scrierea in fisiere in format binar si permite comunicarea intre programe prin intermediul fisierului "test.dat" care este deschis in mod binar (O_BINARY) pentru citire/scriere (O_RDWR), este creat daca nu exista (O_CREAT) si permite a fi deschis de mai multe aplicatii (O_DENYNONE), cu drepturi de scriere si citire pentru proprietar (S_IREAD | S_IWRITE).

#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <sys\stat.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
int handle, bytes;
void * buff;char ch;
void wrln(int h,long pos){ //citeste o linie sau pana la sfarsit de fisier
  char ch;char * tmp=&ch;int bytes;
  lseek(h,pos,SEEK_SET);
  if(filelength(h)==0){printf("\n");return;}
  do {
    bytes= read(h,tmp,1);//citesc un caracter
    printf("%c",ch);
  } while ((ch!=0xa) && (ch!=0xd) && (bytes==1));
  //bytes este 0 la sfarsit de fisier
  printf("\n");
}

void getline(char * s){//citeste o linie de la keyboard
  char ch;int i=0;
  do {
    ch=getche();
    s[i++]=ch;
  } while((ch!=0xa)&&(ch!=0xd)&&(i<255));
  s[--i]=0;
  printf("\n");
}
int main(){
  clrscr();
  buff = malloc(200);
  handle=open("test.dat",O_BINARY | O_RDWR | O_CREAT | O_DENYNONE, S_IREAD | S_IWRITE);
  if(handle==-1){ printf("Eroare nr: %d",errno);return (-1);}
/*
strcpy((char *) buff,"ceva text\r\n");
bytes = _write(handle,buff,strlen((char *) buff));
*/
  wrln(handle,0);
  int cont=1;
  do {
    //wrln(handle,0);
    printf("\nContinuati? [y/n]");
    ch=getche();
    printf("\n");
    wrln(handle,0);
    if((ch!='y') && (ch!='Y')){cont=0;break;}
    printf("Introduceti mesaj: ");
    getline((char *) buff);
/* scanf("%s",buff);*/
    lseek(handle,0,SEEK_SET);//pozitionez pointerul la inceputul fisierului
    strcat((char *)buff,"\r\n");//in fisier adaug CR si LF
    chsize(handle,0);  /* fac lungimea fisierului nula */
    bytes = _write(handle,buff,strlen((char *) buff));
  } while(cont==1);
  close(handle);
}

Cornel Mironel Niculae, 2003-2004

13-Jan-2004