Структуры данных управления процессами и управление процессом

Эта программа должна использовать fork() для создания процессов, сохранять PID дочернего процесса в односвязном списке, после сбоя fork убивать процессы по одному, затем освобождать узлы в связанном списке и, наконец, распечатывать, сколько процессы были созданы до завершения программы.

В настоящее время он не делает этих вещей, и я не уверен, куда с ним идти. Он скомпилируется правильно, но когда я запускаю его в терминале Minix, который я должен использовать, он ничего не делает. Когда я иду, чтобы выключить терминал, я получаю «выключение: не могу разветвить (): ресурс временно недоступен». Так что что-то идет не так, и любая помощь будет оценена по достоинству. Спасибо.

/*
   Problem: Write a complete C-program to determine the number of
   simultaneous processes Minix can support for a single user. Be
   aware that a users' login shell is itself a process. Once this has
   been determined, any processes created will have to be terminated.
   Created processes will have to be kept track of in a singly linked list
   with node structure dynamically allocated at runtime.

   Solution: Create processes until fork() fails. Each child process will
   call pause(). The signal will be delivered by the parent process using
   kill() system call. When fork() fails, terminate the children processes
   one at a time using childs' PID and SIGKILL signal. You will have to
   keep track of children process PIDs in a singly linked list.

   Data-structure used: A singly linked list

   Accessing functions for the data structure: malloc() and free() to
   dynamically handle the node storage

   Errors handled: None.

   Limitations: None.

*/

#define _POSIX_SOURCE
#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

struct lnode {
   int pid;
   struct lnode *next;
};

    /* Dynamically allocates node storage at runtime using
       malloc().
    */

struct lnode*
getnode(void)
{
   return malloc(sizeof(struct lnode));
}

/* Frees nodes dynamically allocated by getnode before
   the program is terminated.
*/

void
freenode(struct lnode *tmp)
{
   free(tmp);
}

/* Display the output of how many simultaneous processes Minix
   can support for a single user.
*/

void
printtotal(int count)
{
   fprintf(stdout, "For this user: %d\n", count);
}

int
main(int argc, char *argv[])
{
   struct lnode *curr;
   struct lnode *tmp;
   int count = 1;
   int pidholder = 1;

   tmp = NULL;

   while(pidholder > 0) {
      curr = getnode();

      pidholder = fork();

      if(pidholder < 0)
         exit(-1);
      else if(pidholder == 0)
         pause();
      else if(pidholder > 0) {
         curr->pid = pidholder;
         curr->next = tmp;
         tmp = curr;
      }
   }

   curr = tmp;

   while(curr) {
      pidholder = curr->pid;

      kill(pidholder, SIGKILL);

      tmp = curr;
      curr = curr->next;
      freenode(tmp);
   }

   printtotal(count);

   exit(0);
}

person mimiG    schedule 26.09.2014    source источник


Ответы (1)


Я понял, где ошибся, оставив программу на ночь и попробовав ее утром по-новому.

Когда fork() терпел неудачу в цикле while, он выходил из программы, и это вызывало проблемы, потому что после удаления этой части программа выполнялась правильно. Я считаю, что это связано с тем, что часть программы kill не запустилась, оставив все эти процессы запущенными. Кроме того, я понял, что забыл включить строку кода для увеличения счетчика, чтобы отслеживать количество создаваемых процессов.

Вот рабочий код для main:

int
main(int argc, char *argv[])
{
   struct lnode *curr;
   struct lnode *tmp;
   int count = 1;
   int pidholder = 0;

   tmp = NULL;

   while(pidholder >= 0) {
      curr = getnode();

      pidholder = fork();

      if(pidholder == 0)
         pause();
      else if(pidholder > 0) {
         curr->pid = pidholder;
         curr->next = tmp;
         tmp = curr;
         count = count + 1;
      }
   }

   curr = tmp;

   while(curr) {
      pidholder = curr->pid;

      kill(pidholder, SIGKILL);

      tmp = curr;
      curr = curr->next;
      freenode(tmp);
   }

   printtotal(count);

   exit(0);
}
person mimiG    schedule 26.09.2014