1

我有两个问题:我制作的程序出现故障并制作了几乎无法杀死的进程,如果任何一个子问题得到解决,我相信这两个问题都会很容易解决。我在 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,但 Activity Monitor 但 Force Quit 无法终止进程,kill -9 [pid] 失败,killall [program name] 失败等等,尽管承认程序的存在。强制终止进程的唯一方法似乎是物理关闭计算机的电源并重新启动它(即关闭不起作用,因为它尝试终止进程但失败了)。如果要调试每次运行我的笔记本电脑都需要重启的程序,我会浪费大量时间!我可以不断创建更多进程,但无法删除它们。

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

任何关于如何在不重启电源的情况下摆脱这些过程的想法都会有很大的帮助,谢谢!

4

2 回答 2

1

在 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)是已失效的进程,括号内的名称是进程的原始名称。当我将程序复制到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 与程序本身的输出相匹配。

于 2013-07-15T00:17:27.893 回答
0

您可以通过运行ps ef或使用htop.

PID   TTY      STAT   TIME COMMAND
21138 tty1     T      0:00 sudo /usr/bin/aura -Akax open_watcom openwatcom-extras-hg HOME=/home/hav3lock USER=hav3lock SHELL=/bin/zsh TERM=linux PATH=/usr/local/sbin:/u
21139 tty1     T      0:00  \_ /usr/bin/aura -Akax open_watcom openwatcom-extras-hg TERM=linux PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/site_perl:/usr/bin/
22111 tty1     Z      0:00      \_ [su] <defunct>`

在上面我有一个僵尸进程,它的妈妈是/usr/bin/aura ,一个由sudo /usr/bin/aura产生的进程。

运行sudo kill -9 21138将杀死父级,从而随后杀死其僵尸生成。

PID   TTY      STAT   TIME COMMAND
23858 pts/9    S+     0:00 sudo sudo ps ef LANG=en_US.utf8 DISPLAY=:0 SHLVL=3 LOGNAME=hav3lock XDG_VTNR=1 PWD=/home/hav3lock/sy.l/repos/pub_rel/slen/linux/src HG=/usr/b
23860 pts/9    S+     0:00  \_ sudo ps ef LANG=en_US.utf8 DISPLAY=:0 LS_COLORS=no=0:fi=0:di=34:ln=00;96:or=91;4:mi=00;31;9:mh=01;37:pi=33;7:so=01;35:do=35:bd=01;33:cd=9
23861 pts/9    R+     0:00      \_ ps ef LANG=en_US.utf8 DISPLAY=:0 LS_COLORS=no=0:fi=0:di=34:ln=00;96:or=91;4:mi=00;31;9:mh=01;37:pi=33;7:so=01;35:do=35:bd=01;33:cd=93
13405 tty2     S<sl+   3:49 X :0 HOME=/home/hav3lock USER=hav3lock SHELL=/bin/zsh TERM=linux PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/site_perl:/usr/bin/ve`
于 2013-07-14T22:58:52.057 回答