<div>Hi. </div><div>Â </div><div>toybox's names_to_pid() func has some limitation because it just checks /proc/%u/cmdline and its first string only.</div><div>so, script executable can't be handled in this function. </div><div>Â </div><div>pidof, killall, bootchartd 3 commands are using this and all are considered by my improvement.</div><div>Further, an embedded target verified all the operation of killall.</div><div>Â </div><div>plz, have a look.</div><div>Â </div><div>Â </div><div>Â </div><div>Â </div><div>Â </div><div>Â lib/lib.c | 36 +++++++++++++++++++++++++++++++-----<br>Â 1 file changed, 31 insertions(+), 5 deletions(-)</div><div>diff --git a/lib/lib.c b/lib/lib.c<br>index d9bea89..8af4116 100644<br>--- a/lib/lib.c<br>+++ b/lib/lib.c<br>@@ -867,16 +867,42 @@ void names_to_pid(char **names, int (*callback)(pid_t pid, char *name))<br>Â <br>Â Â while ((entry = readdir(dp))) {<br>Â Â Â Â unsigned u;<br>-Â Â Â char *cmd, **curname;<br>+Â Â Â char *cmd, *arg, **curname;<br>Â <br>Â Â Â Â if (!(u = atoi(entry->d_name))) continue;<br>-Â Â Â sprintf(libbuf, "/proc/%u/cmdline", u);<br>+<br>+Â Â Â // check stat<br>+Â Â Â snprintf(libbuf, sizeof(libbuf), "/proc/%u/stat", u);<br>Â Â Â Â if (!(cmd = readfile(libbuf, libbuf, sizeof(libbuf)))) continue;<br>Â <br>-Â Â Â for (curname = names; *curname; curname++)<br>-Â Â Â Â Â if (**curname == '/' ? !strcmp(cmd, *curname)<br>-Â Â Â Â Â Â Â Â Â : !strcmp(basename_r(cmd), basename_r(*curname)))<br>+Â Â Â cmd = strchr(cmd, '(')+1;<br>+Â Â Â *strrchr(cmd, ')') = '\0';<br>+Â Â Â for (curname = names; *curname; curname++) {<br>+Â Â Â Â Â int fd, len;<br>+Â Â Â Â Â char *fcurname = basename_r(*curname);<br>+Â Â Â Â Â if (!strcmp(cmd, fcurname)) {<br>Â Â Â Â Â Â Â Â if (callback(u, *curname)) break;<br>+Â Â else continue;<br>+Â Â Â Â Â }<br>+<br>+Â Â Â Â Â // check cmdline<br>+Â Â Â Â Â snprintf(libbuf, sizeof(libbuf), "/proc/%u/cmdline", u);<br>+Â Â if (-1 == (fd = openat(AT_FDCWD, libbuf, O_RDONLY))) continue;<br>+Â Â Â Â Â len = readall(fd, libbuf, sizeof(libbuf));<br>+Â Â close(fd);<br>+Â Â if (len <= 0) continue;<br>+<br>+Â Â libbuf[len] = 0;<br>+Â Â cmd = libbuf;<br>+<br>+Â Â Â Â Â if (!strcmp(basename_r(cmd), fcurname)) {<br>+Â Â Â Â Â Â Â if (callback(u, *curname)) break;<br>+Â Â } else if (len > strlen(cmd)) {<br>+Â Â Â Â Â Â Â arg = basename_r(cmd + strlen(cmd) + 1);<br>+Â Â Â Â Â Â Â if (arg && !strcmp(arg, fcurname))<br>+Â Â Â Â Â Â Â Â Â if (callback(u, *curname)) break;<br>+Â Â }<br>+Â Â Â }<br>Â Â Â Â if (*curname) break;<br>Â Â }<br>Â Â closedir(dp);</div>