Да, это может быть файл с отображенной памятью, как показано в примере ниже.Остерегайтесь, часть C основана на примерах, которые я нашел в StackOverflow, и может содержать серьезные ошибки (она, безусловно, содержит слишком много типов), а также я не совсем уверен, когда происходит запись на диск.Но вы, безусловно, можете открыть файлы других типов, например /dev/urandom
или даже /dev/mem
или именованные каналы , как Стив упоминал в комментарии (пример Python ниже).
Обратите внимание, что fd
(c) или fileno
(Python) не совпадает с файловой единицей Фортрана и не может использоваться в Фортране никоим образом.
read_from_file.f90
SUBROUTINE READER(IN,FVAL)
IMPLICIT NONE
INTEGER IN
REAL FVAL
PRINT *,'READER READING FROM',IN
READ(IN,*) FVAL
PRINT *,'READER DONE',FVAL
RETURN
END
implicit none
integer :: iu
character(256) :: fname
real fval
call get_command_argument(1,value=fname)
open(newunit=iu, file=fname,access="stream", form="formatted")
call READER(iu, fval)
print *,fval
close(iu)
end
mmap.c
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define SIZE 10
void* init(const char *file_path) {
int fd = open(file_path, O_RDWR);
if (fd < 0) {
perror("Could not open file for memory mapping");
exit(1);
}
int result = lseek(fd, SIZE-1, SEEK_SET);
if (result == -1) {
close(fd);
perror("Error calling lseek() to 'stretch' the file");
exit(EXIT_FAILURE);
}
result = write(fd, "", 1);
if (result != 1) {
close(fd);
perror("Error writing last byte of the file");
exit(EXIT_FAILURE);
}
void *start_ptr = mmap(NULL, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
unsigned char *mem_buffer = (unsigned char *) start_ptr;
if (mem_buffer == MAP_FAILED) {
exit(1);
}
printf("Successfully mapped file.\n");
return start_ptr;
}
void unmap(void *start_ptr) {
if (munmap(start_ptr, SIZE) < 0) {
exit(1);
}
printf("Successfully unmapped file.\n");
}
int main(){
char *ptr;
ptr = (char *)init("test");
strcpy(ptr,"42\n\0");
system("./read_from_file test");
strcpy(ptr,"258\n\0");
system("./read_from_file test");
unmap(ptr);
return 0;
}
скомпилировать и запустить
gfortran read_from_file.f90 -o read_from_file
gfortran mmap.c
./a.out
Successfully mapped file.
READER READING FROM -10
READER DONE 42.0000000
42.0000000
READER READING FROM -10
READER DONE 258.000000
258.000000
Successfully unmapped file.
Пример Python-труб:
import os
path = "/tmp/pipe"
os.mkfifo(path)
print(path+"\n")
fifo = open(path, "w")
fifo.write("345\n")
fifo.close()
os.remove(path)
shell 1:
> python fifo.py
/tmp/pipe
shell 2:
>./read_from_file /tmp/pipe
READER READING FROM -10
READER DONE 345.000000
345.000000