Управление процессами и нитями, страница 2

father2.c

#include <process.h>

#include <stdio.h>

#include <stdlib.h>

#include <signal.h>

main(){

      int status;

      spawnl(P_NOWAIT,"./son2","son2",NULL,NULL);

      printf("father still live!\n");

      while(1){

      sleep(1);

      }

}

son2.c

#include <stdio.h>

#include <process.h>

main(){

      sleep(1);

      printf("I'm son, my PID is %i\n",getpid());

}

В результате получаем:

# ./father2&

[4] 1962028

# father still live!

I'm son, my PID is 1966127

pidin -p 1966127

     pid tid name               prio STATE       Blocked

 1966127     (Zombie)

Как видно, присутствует зомби.

Первый способ: игнорировать сигнал SIGCHLD, посылаемый потомком:

father3.c

#include <process.h>

#include <stdio.h>

#include <stdlib.h>

#include <signal.h>

main(){

      int status;

      signal(SIGCHLD,SIG_IGN);

      spawnl(P_NOWAIT,"./son3","son3",NULL,NULL);

      printf("father still live!\n");

      while(1){

      sleep(1);

      }

}

В результате получаем:

# ./father3&

[5] 1974320

# father still live!

I'm son, my PID is 1978417

# pidin -p 1978417

     pid tid name               prio STATE       Blocked

pidin: couldn't open /proc/1978417/as: No such file or directory

Как видно, зомби в этом случае нет.

Второй способ: использование при обращении к spawn() режима P_NOWAITO, который подразумевает наличие признака _SPAWN_NOZOMBIE:

father4.c

#include <process.h>

#include <stdio.h>

#include <stdlib.h>

#include <signal.h>

main(){

      int status;

      spawnl(P_NOWAITO,"./son3","son3",NULL,NULL);

      printf("father still live!\n");

      while(1){

            sleep(1);

      }

}

В результате получаем:

# ./father4&

[6] 1990705

# father still live!

I'm son, my PID is 1994802

# pidin -p 1994802

     pid tid name               prio STATE       Blocked

pidin: couldn't open /proc/1994802/as: No such file or directory

Как видно, зомби в этом случае так же отсутствует.

2. Управление приоритетами

Управлением приоритетами процессов можно управлять с помощью функций библиотеки sched.

int getpriority(pid_t pid)

int setpriority(pid_t pid, int prio)

            pid – PID процесса, операцию над которым требуется совершить

            prio – новое значение его приоритета

Рассмотрим использование этих функций на примере программы getp.c, которая позволяет получить сведения о текущем значении приоритета процесса по PID и изменить его.

getp.c

#include <stdio.h>

#include <sched.h>

#include <stdio.h>

main(){

      int j, i=0, pid=0;

      pid = getpid();

      while(1){

      j=getprio(pid);  

      printf("Priority of PID %i is equal to %i. Enter new priority:\n ",pid,j);

      scanf("%i",&i);

      setprio(pid,i);

      printf("Now priority of PID %i is equal to %i\n",pid,j=getprio(pid));

      }

}

После компиляции программы мы можем изменять приоритет данного процесса: