<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>