如何在QNX cpp代码中按进程名称将SIGTERM发送到进程?

时间:2015-05-28 22:14:25

标签: c++ qnx

例如:我有一个名为foo的过程。

通常在控制台中,我可以键入slay foo然后foo终止。 此外,在cpp代码中,我可以使用system("slay foo");

发出系统调用

我知道system()是一个应该避免的重叉调用。我可以选择<csignal><cstdlib>中的其他功能吗?

我读过SignalKill()和SignalKill_r(),都需要我无法提供的pid。

2 个答案:

答案 0 :(得分:1)

这并不像人们想象的那么简单。 Linux没有提供syscall,它通过名称为您提供PID进程。

假设QNX的文件系统与标准UNI类似,您可能需要阅读this article以了解如何使用其名称查找进程的PID,然后使用{{1}使用PIDSignalKill

以下是在C中使用其名称查找流程SignalKill_r的代码。我无法在PID上对其进行测试,但它适用于QNX

Ubuntu

答案 1 :(得分:1)

为了将进程名称转换为pid,您需要深入了解QNX的/ proc文件系统。我写了一本名为&#34; QNX Cookbook&#34;现在可在QNX的网站(http://www.qnx.com/download/feature.html?programid=26184)免费在线获取。转到第222页,&#34;迭代进程列表&#34;并复制迭代进程列表的代码。这将允许您搜索所有进程以查找要杀死的任何进程(它将为您提供所需的PID)。

void
iterate_processes (void)
{
  struct dirent   *dirent;
  DIR             *dir;
  int             r;
  int             pid;

  // 1) find all processes
  if (!(dir = opendir ("/proc"))) {
    fprintf (stderr, "%s:  couldn't open /proc, errno %d\n",
             progname, errno);
    perror (NULL);
    exit (EXIT_FAILURE);
  }

  while (dirent = readdir (dir)) {
    // 2) we are only interested in process IDs
    if (isdigit (*dirent -> d_name)) {
      pid = atoi (dirent -> d_name);
      iterate_process (pid);
    }
  }
  closedir (dir);
}

void
iterate_process (int pid)
{
  char      paths [PATH_MAX];
  int       fd;

  // 1) set up structure
  static struct {
    procfs_debuginfo    info;
    char                buff [PATH_MAX];
  } name;

  sprintf (paths, "/proc/%d/as", pid);

  if ((fd = open (paths, O_RDONLY)) == -1) {
    return;
  }

  // 2) ask for the name
  if (devctl (fd, DCMD_PROC_MAPDEBUG_BASE, &name,
              sizeof (name), 0) != EOK) {
    if (pid == 1) {
      strcpy (name.info.path, "(procnto)");
    } else {
      strcpy (name.info.path, "(n/a)");
    }
  }

  // 3) we can compare against name.info.path here...
  do_process (pid, fd, name.info.path);
  close (fd);
}

通过提供您想要的任何操作&#34; do_process()&#34;,您可以例如按姓名杀人等。