跳到主要內容

Get ProcessId by Process Name on FreeBSD/Mac OS X

因為某原因,我必須在FreeBSD上寫個daemon去監控另一個process,也就是俗稱的Watch Dog,貪圖開發方便,就用OS X上的XCode當作開發工具。

原本在FreeBSD上有kvm_getprocs,但是OS X上並沒有(另外我不知道會不會造成只看得到user space process),所以我就改找sysctl
int getProcessIdByName(char *processname)
{
 struct kinfo_proc *procs = NULL, *newprocs;
 char  thiscmd   [MAXCOMLEN + 1];
 pid_t  thispid;
 int  mib        [4];
 size_t  miblen;
 int  i         , st, nprocs;
 size_t  size;

 int  processid = 0;
 size = 0;
 mib[0] = CTL_KERN;
 mib[1] = KERN_PROC;
 mib[2] = KERN_PROC_ALL;
 mib[3] = 0;
 miblen = 3;

 st = sysctl(mib, (u_int) miblen, NULL, &size, NULL, 0);
 do {
  size += size / 10;
  newprocs = realloc(procs, size);
  if (newprocs == 0) {
   if (procs)
    free(procs);
  }
  procs = newprocs;
  st = sysctl(mib, (u_int) miblen, procs, &size, NULL, 0);
 } while (st == -1 && errno == ENOMEM);

 nprocs = (int)size / sizeof(struct kinfo_proc);

 for (i = 0; i < nprocs; i++) {
  thispid = procs[i].ki_pid;
  strncpy(thiscmd, procs[i].ki_comm, MAXCOMLEN);
  thiscmd[MAXCOMLEN] = '\0';
  if (strcmp(thiscmd, processname) == 0) {
   processid = thispid;
  }
 }
 free(procs);
 return processid;
}

留言

這個網誌中的熱門文章

自然人憑證讀卡機驅動程式

鳥毅用的是第一代的自然人憑證讀卡機,EZ100PU(後來有同事買EZmini可以讀SIM卡似乎更好),每年報稅時用一次。 本來只是要申請些政府業務,一時之間找不到光碟,沒想到在 驅動程式下載 居然看到Linux和Mac的驅動程式,剩下的就是政府單位的網頁和程式應該改版了吧!!!

DBeaver 介面語言

DBeaver是我個人頗常用的一套跨平台Database管理工具,最近升級後發現Windows版本居然變成簡體中文,而且無法切換為英文。

如何將較高版本SQL Server複製到低版本SQL Server (降級為舊版)並保留權限及資料庫圖表

一般若是要將SQL Server裡的Database轉往其他Server時,最簡單的方式就是備份(Backup)後再還原(Restore),或者是䣃離(detach)後附加(attach)。 但是很不幸地,若是由較低版本(e.g. 2008)到較高版本(e.g. 2012)要怎麼辦呢?