2013-07-14 3 views
1

У меня есть две проблемы: программа, которую я сделал, сжимаю и делаю почти неудобные процессы, если любая подзадача решена. Я считаю, что обе проблемы будут легко решены. Я запускаю Macbook в начале 2008 года на OSX 10.6.8.Как убить процессы зомби?

/Проблема № 1, кодирование:/

Я играл вокруг с IROBOT Создание с помощью termios.h ввода/вывода. Я компилирую без предупреждений или ошибок и могу запускать программу без сучка и задоринки. Я подключаюсь к роботу usb, который объясняет ввод «/dev/tty.usbserial».

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

Программа начинается с проверки аргументы, переданные, а затем пытается соединиться с данным аргументом (символ * устройство /dev/tty.usbserial) с функцией biscConnect(). Это не удается на моем 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, но монитор активности, но Force Quit не может убить процесс, убить -9 [pid] не удается, killall [имя программы] не работает и т. Д., Несмотря на признание существования программы. Единственный способ принудительно прекратить процесс, похоже, заключается в физическом закрытии питания с компьютера и его перезагрузке (т. Е. Сбрасывание не работает, потому что оно пытается и не удается завершить процесс (ы)). Я трачу огромное количество времени, если отлаживать программу, которую мне нужно, чтобы каждый цикл запускать мой компьютер! Я могу постоянно создавать больше процессов, но не могу их удалить.

Я думаю, что если бы я знал родительский процесс, я мог бы убить эти «зомби», но я не знаю, что такое родитель.

Любые идеи о том, как избавиться от этих процессов без использования энергии, будут огромной помощью, спасибо!

+2

Вы не можете убивать зомби; это неживые процессы. Вы можете убить родительский процесс зомби, и в этом случае зомби унаследованы процессом init, который быстро выводит их из их несчастья. –

+0

@JonathanLeffler: Не зомби регулярно собираются? –

+0

@JonathanLeffler: Я вижу, так можно было бы убить родителя, который, в свою очередь, убил бы ребенка? Проблема в том, что я не знаю, кто является родителем. – nico

ответ

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 идентифицирует колонки родительский процесс зомби, а различные идентификаторы процессов соответствуют результатам самих программ.

+1

@Alexej: спасибо за редактирование. Однако, поскольку программа производит разные выходные данные каждый раз, когда она запускается (разные PID), прошлое время является правильным - детали в примерах исторически точны и, хотя и представляют то, что кто-либо увидит, отчетливо отличаются от того, что кто-либо еще видеть. –

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/бен/аура, процесс, порожденный Судо/USR/бен/аура.

Запуск 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` 
+0

Примечание: я использовал 'ps ef' для этого сообщения, а не' htop'. Кроме того, я должен отметить, что я запускал ** ps ef **, используя * * sudo **. –

+0

Убийство 21138 может убить или не убить 21139, а зомби не пойдет до 21138 г. –

+0

Хорошо, я получаю это: 501 1507 1 0 0: 00.00 ?? 0: 00.01 ./simple/dev /tty.usbserial, но как это помогает? Не кажется * родителем, он просто признает его существование. – nico

Смежные вопросы