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그것과는 아무런 관련이 없습니다(이것이 제가 원래 명확히 하고 싶었던 것입니다).

이 기사는 인터넷의 다양한 출처에서 나온 더 깊은 문제를 다루는 데 가장 가깝기 때문에 후손을 위해 여기에 좀 더 많은 맥락을 제공하는 것이 합리적이라고 생각했습니다.

관련 정보