I wrote a simple function, which allows two or more programs to share a memory buffer. This can be quite useful for interprocess communication. For example you have one program which generates data and another program which processes it. It can be used like this:
Code: Select all
'program1.bas:
dim as ubyte ptr memory
memory=create_sharedmem(32) '32 bytes
do
memory[0]=rnd()*&hFF 'Write some random values in the buffer
sleep 500
loop
'program2.bas:
dim as ubyte ptr memory
memory=create_sharedmem(32) '32 bytes
do
print memory[0] 'Print the values generated by "program1.bas"
sleep 500
loop
Here is the code for "create_sharedmem()". I didn't use header files, because I couldn't find any and I didn't want to translate the C-headers. It uses the "OPEN" and "MMAP" syscalls from Linux:
Code: Select all
dim shared as zstring*10 key = "SHM_TEST"
#define SYS_READ &h00
#define SYS_WRITE &h01
#define SYS_OPEN &h02
#define SYS_CLOSE &h03
#define SYS_STAT &h04
#define SYS_FSTAT &h05
#define SYS_LSTAT &h06
#define SYS_POLL &h07
#define SYS_LSEEK &h08
#define SYS_MMAP &h09
#define SYS_MPROTECT &h0A
#define SYS_MUNMAP &h0B
#define SYS_BRK &h0C
'...
#define SYS_FTRUNCATE &h4D
#define PROT_READ &h01
#define PROT_WRITE &h02
#define PROT_EXEC &h04
#define PROT_NONE &h00
#define O_RDONLY &h00
#define O_WRONLY &h01
#define O_RDWR &h02
#define O_ACCMODE &h03
#define O_CREAT &h100
#define MAP_SHARED &h01
#define MAP_PRIVATE &h02
#define MAP_FIXED &h10
#define MAP_FILE &h00
#define MAP_ANONYMOUS &h20
#define S_ISUID 0004000
#define S_ISGID 0002000
#define S_IRWXU 0000700
#define S_IRUSR 0000400
#define S_IWUSR 0000200
#define S_IXUSR 0000100
function syscall(nummer as uinteger, par1 as uinteger=0, par2 as uinteger=0, par3 as uinteger=0, par4 as uinteger=0, par5 as uinteger=0, par6 as uinteger=0) as uinteger
asm
mov rdi, par1
mov rsi, par2
mov rdx, par3
mov r10, par4
mov r8, par5
mov r9, par6
mov rax, nummer
syscall
mov [function], rax
end asm
end function
function create_sharedmem(size as uinteger)as ubyte ptr
dim as ulong fd
fd=syscall(SYS_OPEN, cast(uinteger,@key), O_RDWR or O_CREAT, S_IRUSR or S_IWUSR)
syscall(SYS_FTRUNCATE, fd, size)
return cast(ubyte ptr,syscall(SYS_MMAP,, size, PROT_READ or PROT_WRITE, MAP_SHARED, fd))
end function