c - 如何杀死僵尸进程?

标签 c macos terminal zombie-process

我有两个问题:我制作的一个程序出现故障并产生几乎无法终止的进程,如果解决了其中一个子问题,我相信这两个问题都会很容易解决。我在 OSX 10.6.8 上运行 2008 年初的 Macbook。

/问题 #1,编码:/

我一直在尝试使用 termios.h I/O 的 iRobot Create。我在没有警告或错误的情况下进行编译,并且可以顺利运行该程序。我通过 usb 连接到机器人,这解释了输入“/dev/tty.usbserial”。

 gcc simple.c -o simple
 ./simple /dev/tty.usbserial

程序首先检查给定的参数,然后尝试使用 biscConnect() 函数连接给定的参数(char * 设备是/dev/tty.usbserial)。它在我的 Mac 上失败了。

//in file simple.c:
int main(int argc, char *argv[]){
if(argc!=2){
    printf("Put port... like /dev/tty.usbserial or something\n");
    exit(EXIT_FAILURE);
}
printf("Starting...\n");
biscConnect(argv[1]);
}
void biscConnect(char *device){
struct termios tty;

// Try to open the device from the input
    if((fd = open(device, O_RDWR | O_NOCTTY | O_NONBLOCK))==-1){
        fprintf(stderr, "Serial port at %s could not be opened: %s\n", device, strerror(errno));
        exit(EXIT_FAILURE);
    }
     tcflush (fd, TCIOFLUSH);
     tcgetattr(fd, &tty);
     tty.c_iflag     = IGNBRK | IGNPAR;
     tty.c_lflag     = 0;
     tty.c_oflag     = 0;
     tty.c_cflag     = CREAD | CS8 | CLOCAL;
     cfsetispeed(&tty, B57600);
     cfsetospeed(&tty, B57600);
     tcsetattr(fd, TCSANOW, &tty);

     //The code fails prior to this point
}

如果在此之前没有卡住,我会向机器人发送字节以使其移动。

/问题 #2,无法终止的进程:/ 当我运行文件时,终端进入一种奇怪的模式,提示消失了,我可以输入任何我想要的东西(通常表示进程正在运行)。我无法使用 control-c 退出。我似乎可以退出的唯一方法是关闭终端窗口。这无法终止正在运行的进程。

我可以很容易地查找 pid 但事件监视器但是强制退出无法终止进程,kill -9 [pid] 失败,killall [程序名称] 失败等,尽管承认该程序的存在。强制终止进程的唯一方法似乎是物理关闭计算机的电源并重新启动它(即关闭不起作用,因为它尝试终止进程,但失败了)。如果调试程序我需要在每次运行时重新启动我的笔记本电脑,我会浪费大量时间!我可以不断创建更多进程,但无法删除它们。

我想如果我知道父进程,我也许可以杀死这些“僵尸”进程,但我不知道父进程是什么。

关于如何在不重新启动电源的情况下摆脱这些进程的任何想法都将是巨大的帮助,谢谢!

最佳答案

在 Mac OS X 10.8.4 上,我创建了一个程序 zombie来自 zombie.c :

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
    pid_t pid;

    if ((pid = fork()) >= 0)
    {
        if (pid == 0)
        {
            printf("%d: committing suicide (parent %d)\n", (int)getpid(), (int)getppid());
            exit(0);
        }
        else
        {
            printf("%d: going to sleep for a while - child %d might die while I snooze\n",
                (int)getpid(), (int)pid);
            sleep(30);
            printf("%d: awake\n", (int)getpid());
        }
    }
    return 0;
}

当我在一个终端窗口中运行它时,输出是:

$ ./zombie
2443: going to sleep for a while - child 2444 might die while I snooze
2444: committing suicide (parent 2443)
2443: awake
$

在另一个终端窗口中,运行 ps -f制作:

  UID   PID  PPID   C STIME   TTY           TIME CMD
  503   260   249   0 12:42PM ttys004    0:00.08 -bash
  503  2443   260   0  5:11PM ttys004    0:00.00 ./zombie
  503  2444  2443   0  5:11PM ttys004    0:00.00 (zombie)

圆括号(zombie)是defunct进程,括号中的名字是进程原来的名字。当我把程序复制到living-dead ,对应的输出为:

  UID   PID  PPID   C STIME   TTY           TIME CMD
  503   260   249   0 12:42PM ttys004    0:00.09 -bash
  503  2454   260   0  5:13PM ttys004    0:00.00 ./living-dead
  503  2455  2454   0  5:13PM ttys004    0:00.00 (living-dead)

(在大多数系统上,已失效的进程被标记为 <defunct> 或类似的东西。)

显然,PPID 中的值列标识僵尸的父进程,各种进程 ID 与程序本身的输出相匹配。

关于c - 如何杀死僵尸进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17644489/

相关文章:

java - 在 Cucumber 中,如何传递文件路径的位置以使其适用于 Windows 和 MAC

macos - 苹果机 : gnome-terminal equivalent for shell script

macos - 找不到 Bash 命令——$PATH 已损坏

linux - 如何将 'stdout' 重定向到 'stderr' 并将 'stderr' 重定向到 'stdout'?

c - 具有相同参数的相同函数会产生不同的结果

objective-c - 在 OSX 中为给定进程禁用定时器合并

mysql - 在 MySQL 查询完成之前,Automator 发送带有不完整表的电子邮件

android - adb shell android 上的 ncurses

无法将字符串放入二维数组中

php - 在 C 中执行和存储命令的结果