2010-11-07 52 views
1

我需要检查某些Debian软件包是否安装在我的C程序中的某个系统上。我可以使用外部shell脚本,它使用system()来执行apt-cache输出的grep魔术,但它看起来有点不雅和骇人听闻,以及如果用户安装的语言不同,它将不起作用。有没有一个C库我可以挂钩查询软件包安装?用于在C中查询已安装(Debian)软件包的库?

+0

请参阅http://stackoverflow.com/q/341520/129570。 – 2010-11-07 01:28:41

+2

所有答案,包括apt-cache自己的源代码和libept都是C++接口。 – 2010-11-07 01:35:35

+0

用户的语言如何干扰dpkg -l和grep? – 2016-01-23 01:59:25

回答

2

我不认为你会找到符合条件的附带库,但dpkg程序在内部完全按照你所描述的内容进行,并且不会链接到C++库(或libstdC++):

[email protected]:~$ ldd -v /usr/bin/dpkg 
     linux-gate.so.1 => (0x00f33000) 
     libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0x00dfb000) 
     libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x0077a000) 
     /lib/ld-linux.so.2 (0x006a6000) 

如果apt-get source dpkg,我想你会发现,你在lib/dpkg需要的源代码树中的代码,特别是database.cparse.c

诀窍当然是从中提取你需要的东西。另外,GPL可能会或可能不会同意你的项目,但至少它是一个学习的实施。

例如,dpkg读取数据库的例子可以通过dpkg -l | grep ii查看,以查看所有已安装的软件包。这听起来像你只需要将这些信息放入一个优雅的数组或列表中,我想你会在dpkg的范围内找到有关如何做到这一点的灵感。

如果你最终编写自己的库(或封装在dpkg中的位),请把它放在其他人可以找到它的地方。你需要的是许多人共同分享的经常性需求。

相关问题