![DWM이 애플리케이션을 잘못 시작함](https://linux55.com/image/175934/DWM%EC%9D%B4%20%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%9D%84%20%EC%9E%98%EB%AA%BB%20%EC%8B%9C%EC%9E%91%ED%95%A8.png)
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 포인터로 끝나야 합니다.
따라서 이것은 dwm의 내부 작업에 의해 부과된 제한 사항이며 execvp
그것과는 아무런 관련이 없습니다(이것이 제가 원래 명확히 하고 싶었던 것입니다).
이 기사는 인터넷의 다양한 출처에서 나온 더 깊은 문제를 다루는 데 가장 가깝기 때문에 후손을 위해 여기에 좀 더 많은 맥락을 제공하는 것이 합리적이라고 생각했습니다.