用虚拟地址读取Proc / [pid] / mem

时间:2016-06-30 13:09:38

标签: c linux

如果我希望直接使用其他应用程序的虚拟地址访问数据,我可以使用虚拟地址访问proc / [pid] / mem吗?偏移量是否与虚拟地址相同?
代码方面,如果我fseeko(the-proc/[pid]/mem-File, virtual_address, SEEK_SET);fread来自virtual_address的金额,我是否会从应用程序的虚拟地址获取数据?

谢谢!

2 个答案:

答案 0 :(得分:0)

/ proc / [pid]就是这样,它保存给定PID的进程信息。请记住,每个进程都有自己的PID,由linux内核全局存储。

这是一个如何从proc读取proc的statm部分的例子。根据相应的联机帮助页,此代码可以很容易地适应/ proc / [pid] / mem。

const char *statm_path = "/proc/[pid]/statm";    

proc_f = fopen(statm_path, "r");
if (proc_f == NULL)
{
    perror("Error opening proc file");
    return;
}

// Writing the info from /proc/[pid]/statm to a struct.
if (7 != fscanf(proc_f, "%ld %ld %ld %ld %ld %ld %ld", &result.size, 
    &result.resident, &result.share, &result.text, &result.lib, 
    &result.data, &result.dt))
{
    perror(statm_path);
    return;
}
fclose(proc_f);

对于/ mem中的字段,我建议this page。在这里,您可以访问页面上列出的任何统计数据。我不认为您可以显式访问特定变量或类似的变量,因为每个进程都有自己的内核单独维护的虚拟内存空间。充其量它可能会变得非常混乱。

答案 1 :(得分:0)

你无法做到这一点。但我相信你所寻找的是Public Function BalancoTotal() SqlCon = New SqlConnection SqlCon.ConnectionString = "........" Try SqlCon.Open() Query2 = "SELECT CAST(SUM(amountTransaction) AS INT) FROM Transactions" SqlCmd = New SqlCommand(Query2, SqlCon) SqlDR = SqlCmd.ExecuteReader If SqlDR.Read() Then Return SqlDR.GetDecimal(0) End If Catch ex As Exception MsgBox(ex.Message) Finally SqlCon.Close() End Try End Function 。任何两个进程都可以使用共享内存读写公共内存。进程之间此共享内存的虚拟地址可能不同。并且必须由用户以受控方式访问它,没有给出自然锁定机制。

来自linklinuxgazette对示例有很好的解释。