打印DBUS连接对应的进程的PID和名字
来源:互联网 发布:以色列 巴勒斯坦 知乎 编辑:程序博客网 时间:2024/06/05 02:24
1) C 语言实现:
#include <gio/gio.h>#include <stdlib.h>#include <stdio.h>#include <sys/types.h>#include <fcntl.h>#ifdef G_OS_UNIX//#include <gio/gunixfdlist.h>/* For STDOUT_FILENO */#include <unistd.h>#endifGDBusProxy *dbus_proxy;GMainLoop * g_main_loop;char *dbus_name;#define PROCESS_NAME_LENGTH 255int sysfs_read(char *proc_file_name, char *cmdline, int len){int fd = open(proc_file_name, O_RDONLY);int n = read(fd, cmdline, len);close(fd);return n;}voidget_pid_from_dbus_name_cb(GObject *source_object, GAsyncResult *res, gpointer user_data){ GError *error = NULL; GVariant *result = NULL; guint pid; gchar process_name[PROCESS_NAME_LENGTH] = ""; gchar proc_path[64] = ""; int ret; result = g_dbus_proxy_call_finish (dbus_proxy, res, &error); if (error) { printf("get_pid_from_dbus_name_cb failed: %s\n", error->message); g_error_free(error); } else if (result) { g_variant_get(result, "(u)", &pid); g_variant_unref(result); /* safety check */ if (pid != 0) { sprintf(proc_path, "/proc/%u/cmdline", pid); ret = sysfs_read(proc_path, process_name, PROCESS_NAME_LENGTH); if (ret < 0) { printf("error reading process name from %s: %d", proc_path, ret); strcpy(process_name, "UNKNOWN"); } //g_debug("PID: %u, Process Name: %s", pid, process_name); printf("PID: %u, Process Name: %s\n", pid, process_name); } else { /* not sure this can happen */ printf("unable to get pid info\n"); } }g_main_loop_quit(g_main_loop);exit(0);}voiddbus_proxy_connect_cb(GObject *source_object, GAsyncResult *res, gpointer user_data){ GError *error = NULL; dbus_proxy = g_dbus_proxy_new_finish (res, &error); if (error) { g_warning("dbus_proxy_connect_cb failed: %s", error->message); g_error_free(error); dbus_proxy = NULL; } else { g_debug("dbus_proxy_connect_cb succeeded"); g_dbus_proxy_call(dbus_proxy, "GetConnectionUnixProcessID", g_variant_new("(s)", dbus_name), G_DBUS_CALL_FLAGS_NONE, -1, NULL, (GAsyncReadyCallback)get_pid_from_dbus_name_cb, NULL); }}int main (int argc, char **argv){GDBusConnection *bcon;GMainLoop *loop;if(argc != 2){return -1;}dbus_name = argv[1];g_type_init ();//bcon = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL);g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,NULL, "org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus", NULL, (GAsyncReadyCallback)dbus_proxy_connect_cb, NULL);//g_dbus_proxy_call (bproxy, "HelloWorld", g_variant_new ("(s)", "Wow"), G_DBUS_CALL_FLAGS_NONE, -1, NULL, (GAsyncReadyCallback) mycallback, NULL);g_main_loop = g_main_loop_new(NULL, FALSE);g_main_loop_run(g_main_loop);return 0;}
编译:
gcc gdbus-get-pid.c `pkg-config --cflags --libs gio-2.0 gio-unix-2.0` -g -o gdbus-get-pid
运行方式:
$ ./gdbus-get-pid :1.6PID: 953, Process Name: /lib/systemd/systemd-logind
./gdbus-get-pid org.freedesktop.UDisks2PID: 2887, Process Name: /usr/lib/udisks2/udisksd输入可以是 DBUS连接的 unique name,或者是 well-known name.
2. 使用 dbus-send 命令:
e$ dbus-send --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.GetConnectionUnixProcessID string::1.6 method return sender=org.freedesktop.DBus -> dest=:1.166 reply_serial=2 uint32 2517
$ dbus-send --system --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.GetConnectionUnixProcessID string::1.6 method return sender=org.freedesktop.DBus -> dest=:1.113 reply_serial=2 uint32 953
$ dbus-send --system --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.GetConnectionUnixProcessID string:org.freedesktop.UDisks2method return sender=org.freedesktop.DBus -> dest=:1.114 reply_serial=2 uint32 2887
3. python代码:
#!/usr/bin/pythonimport dbusimport sysbus=dbus.SystemBus().get_object('org.freedesktop.DBus', '/org/freedesktop/DBus');print dbus.Interface(bus, 'org.freedesktop.DBus').GetConnectionUnixProcessID(sys.argv[1])
References:
1. http://www.mattfischer.com/blog/?p=494
0 0
- 打印DBUS连接对应的进程的PID和名字
- 1.4 打印进程的PID
- 如何查看pid进程号和对应的端口号
- 查看当前端口对应的进程名字
- windows和linux下使用命令查找端口对应的进程pid并杀死进程
- 进程名字获取进程的进程号PID,类似pidof,C函数,适合linux,AIX和hp-unix平台
- Python获取pid和进程名字
- python创建子进程 proc.pid(),打印出子进程PID,打印出的进程号,和top显示的相差1
- Android根据本地端口号寻找对应的用户UID和进程PID
- 通过模块参数进程PID打印进程的虚存区
- 获取tcp/udp端口对应的进程pid
- 获取tcp/udp端口对应的进程pid
- 关于查看进程、查看端口号对应的pid
- DBus 进程间的通信
- linux 下根据进程名字获取进程的进程号PID,类似pidof,C函数
- linux 下根据进程名字获取进程的进程号PID
- 检查服务器的pid文件,如果文件不存在或pid对应的进程已死重启服务器
- shell 编程8 获取 java程序的pid 杀死pid 对应的进程
- 黑马程序员-objective-c基础学习
- JavaSE复习之十四 高级特性:GUI
- ENVI IDL读写数据
- JavaSE复习之十五 高级特性:安全
- 孙悟空:那是一千多年,我们都没有什么经验。 唐三藏:悟空,你可知道我吃的什么肉
- 打印DBUS连接对应的进程的PID和名字
- proc_create的使用方法
- 删除ADT,重新安装ADT
- This is a test
- [leetcode] Linked List Cycle II
- 把二叉树的叶子节点连成一个二叉链表
- qt5.3.0 vs打包完美解决方案
- 有向图是否有环,无向图是否有环
- Codeforces Round #279 (Div. 2) E