したがって、最初にプロセスAは、ストリーム(UART)から読み取られたデータ(37バイト)を含むファイルを生成します。
プロセスBは/ dev / shmに保存されているこのデータを取得する必要があります。
プロセスAがファイルに書き込むことができる絶対最大時間は4ミリ秒です。この値を超えると、許容できないデータ損失が発生します。ファイル生成には平均600usかかります。これは完全に大丈夫で、ランダムに7ms以上に急増しません。
ファイル処理を避けるために、配列のアドレスを起動パラメータとして渡してRAMに直接アクセスしたいと思います。
// Process A
sprintf(cmd, "path_to_file.out %i", (unsigned int)&rx_buffer);
system(cmd);
// Process B
int rx_buffer_address = atoi(argv[1]);
使用Gillesが提案した手順、一度読むことができました。
sprintf(mem_file_name, "/proc/%d/mem", pid);
mem_fd = open(mem_file_name, O_RDONLY);
ptrace(PTRACE_ATTACH, pid, NULL, NULL);
waitpid(pid, NULL, 0);
lseek(mem_fd, offset, SEEK_SET);
read(mem_fd, buf, _SC_PAGE_SIZE);
ptrace(PTRACE_DETACH, pid, NULL, NULL);
関数にclose(mem_fd)を追加しても、このメソッドを実行しようとする2回目の試みは繰り返し失敗します。 open() は ENOENT (該当するファイルやディレクトリなし) を返し、 ptrace は ESRCH (該当するプロセスなし) を返します。
さらなる調査によると、最初のPTRACE_DETACH呼び出しがESRCHを返したことがわかりました。
ptrace() 検索、PTRACE_PEEKDATAを使用してメモリを読み取ろうとすると、すべての読み取りは0xFFを返します。
PEEKDATAメソッドでアクセスするローカルマップが/ memファイル記述子と異なりますか?それとも、この2つの方法やファイルアクセス時間について何かが抜けましたか?