DWM 错误地启动应用程序

DWM 错误地启动应用程序

DWM (6.2) 似乎正在使用额外的参数启动我的命令,我不知道为什么。我几乎有一个库存 config.h 文件,我所做的唯一更改是添加额外的命令和键绑定。两个例子:当我启动 Dolphin 时,我希望它只执行“/usr/bin/dolphin”,但它似乎执行“/usr/bin/dolphin /home/myuser/st/”,这会导致 Dolphin 启动,但在一个不存在的目录。当我启动 Firefox 时,有一堆额外的选项卡,其中包含“/usr/bin/terminator”、“/usr/bin/spotify”等位置,基本上是我与其他键绑定绑定的其他命令。我对 C 的了解非常有限,我尝试研究 dwm.c 中的“spawn”函数,但我并不完全理解它。这是我的 config.h 文件的相关部分。谢谢大家。

static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
static const char *termcmd[]  = { "st", NULL };
static const char *dolphin[] = {"/usr/bin/dolphin"};
static const char *terminator[] = {"/usr/bin/terminator"};
static const char *firefox[] = {"/usr/bin/firefox"};
static const char *spotify[] = {"/usr/bin/spotify"};

/* ##########  Custom Commands : End ########## */

/* ##########  Key Bindings : Start ########## */

static Key keys[] = {
    /* Format = {modifier, key, function, {argument}} */
    { MODKEY,                       XK_p,      spawn,          {.v = dmenucmd } },
    { MODKEY|ShiftMask,             XK_Return, spawn,          {.v = termcmd } },
    {MODKEY|ShiftMask, XK_e, spawn, {.v = dolphin}},
    {MODKEY|ShiftMask, XK_t, spawn, {.v = terminator}},
    {MODKEY|ShiftMask, XK_i, spawn, {.v = firefox}},
    {MODKEY|ShiftMask, XK_m, spawn, {.v = spotify}},
    { MODKEY,                       XK_b,      togglebar,      {0} },

答案1

弄清楚了!因此,在“spawn”函数中,它调用“execvp”(执行命令的函数),如下所示:

int execvp(const char *file, char *const argv[]);

在此默认行中:

static const char *termcmd[]  = { "st", NULL };

它有命令“st”和参数“NULL”。我修改了自己的线路来模仿:

static const char *termcmd[]  = { "/usr/bin/firefox", NULL };

现在它按预期工作了。

答案2

虽然我没有遇到这个确切的错误,但我确实有一个类似的问题为什么需要以 . 结尾的命令NULL。虽然原始答案确实解决了“如何使命令在 dwm 上下文中工作”的问题,但它没有回答“为什么需要这样做”的更深层次问题。

对于同样好奇的人来说与命令有关execvp。这是手册页的相关部分:

execv()、execvp() 和 execvpe() 函数提供指向以 null 结尾的字符串的指针数组,这些字符串表示新程序可用的参数列表。按照惯例,第一个参数应该指向与正在执行的文件关联的文件名。指针数组必须以 NULL 指针终止。

https://linux.die.net/man/3/execvp

所以这是一个由 dwm 的内部工作施加的限制execvp,与它无关(这是我最初想要澄清的)。

由于这篇文章最接近于解决互联网上许多不同来源的更深层次问题,我认为为了后代的缘故,在这里提供更多背景信息是有意义的。

相关内容