[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: _Hz_  
Форум » Программирование » ПО ВТ и АС в ДИТУДе » UNIX (программирование в unix системах, использование процессов)
UNIX
_Hz_Дата: Среда, 29.07.2009, 17:31 | Сообщение # 1
Генералиссимус
Группа: Администраторы
Сообщений: 179
Награды: 11
Репутация: 7
Статус: Offline
Напишите, откомпилируйте и запустите программу, которая бы запускала процесс с помощью fork() так, чтобы процесс-родитель и процесс-ребенок совершали разные действия (какие – не важно).

Code
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char *argv[], char *envp[])
{   
int a = 0;
pid_t pid, ppid;   
(void)fork();
a = a+1;
pid = getpid();
ppid = getppid();
pid = fork();
if(pid == -1)
{   
      printf("Oshibka");
}   
else if (pid == 0)
{
printf("Process-rebenok:");
(void) execl("/bin/ls", "/bin/ls", "-r", "-t", "-l", (char *) 0);
}   
else   
{
     printf("Process-roditel:");
}
printf("Error on program start\n");
return 0;       
}

Написать программу, которая иллюстрирует использование системных вызовов open(), write(), read() и close() для записи информации в файл.

Code
/*Программа Task1.с, иллюстрирующая использование системных вызовов   
open(), write() и close() для записи информации в файл */   
     
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
   int FileDescriptorWrite;
   int FileDescriptorRead;
   int SizeFile;
   char* MyString = "Read and Write in File";
   char* MyStringRead[23];

   (void)umask(0);

   if((FileDescriptorWrite = open("MyFile1.txt", O_WRONLY | O_CREAT, 0666)) < 0)
   {
    printf("Can\'t open file\n");
    return -1;
   }

   SizeFile = write(FileDescriptorWrite, MyString, 23);
   if (SizeFile != 23)
   {
    printf("Can\'t write all string\n");
    return -1;
   }
     
   if(close(FileDescriptorWrite) < 0)
   {
    printf("Can\'t close file\n");
   }

   if((FileDescriptorRead = open("MyFile1.txt", O_RDONLY | O_CREAT, 0666)) < 0)
   {
    printf("Can\'t open file\n");
    return -1;
   }

   SizeFile = read(FileDescriptorRead, MyStringRead, 23);
   if (SizeFile < 0)
   {
    printf("Can\'t read string\n");
    return -1;
   }
     
   printf("%s\n", MyStringRead);

   if(close(FileDescriptorRead) < 0)
   {
    printf("Can\'t close file\n");
   }
   return 0;
}

Написать программу, которая иллюстрирует работу с pipe в рамках одного процесса.

Code
/* Программа Task2.с, иллюстрирующая работу с pip'ом в рамках одного процесса */   

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
   int  FileDescriptor[2];
   int  SizeString;
   char StringBefore[] = "Read and Write in PIPE";
   char StringAfter[23];

   if (pipe(FileDescriptor) < 0)
   {
    printf("can\'t create pipe\n");
    return -1;
   }

   SizeString = write(FileDescriptor[1], StringBefore, 23);
   if (SizeString != 23)
   {
    printf("Can\'t write all string\n");
    return -1;
   }

   SizeString = read(FileDescriptor[0], StringAfter, 23);
   if (SizeString < 0)   
   {
    printf("can\'t read string\n");
    return -1;
   }

   printf("%s\n", StringAfter);

   if (close(FileDescriptor[0]) < 0)
   {
    printf("Can\'t close input stream\n");
   }
     
   if (close(FileDescriptor[1]) < 0)
   {
    printf("Can\'t close output stream\n");
   }
     
   return 0;
}

Написать программу, которая иллюстрирует однонаправленную связь через pipe между процессом-родителем и процессом-ребенком.

Code
/* Программа Task3.с, осуществляющая однонаправленную связь через pipe   
между процессом-родителем и процессом-ребенком */   

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
      int  FileDescriptor[2];   
      int  Result;
      int  SizeString;
      char StringWrite[] = "Read and write in PIPE";   
      char StringRead[23];   

      if(pipe(FileDescriptor) < 0)
      {
          printf("Can\'t create pipe\n");
          return -1;   
      }
     
      Result = fork();   

      if ((Result == 1) || (Result < 0))
      {   
          printf("Can\'t fork child\n");
          return -1;

      }else
      {
   if (Result > 0)   
   {
           close(FileDescriptor[0]);
           SizeString = write(FileDescriptor[1], StringWrite, 23);

           if(SizeString != 23)
    {
               printf("Can\'t write all string\n");   
               return -1;   
           }   

           close(FileDescriptor[1]);
           printf("Parent exit\n");

       }else   
   {
           close(FileDescriptor[1]);
           SizeString = read(FileDescriptor[0], StringRead, 23);

           if(SizeString < 0)
    {
               printf("Can\'t read string\n");   
                   return -1;   
           }   

            printf("%s\n",StringRead);
            close(FileDescriptor[0]);
    printf("Child exit\n");
     
    }
      }
       
      return 0;   
}


 
_Hz_Дата: Среда, 29.07.2009, 17:33 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 179
Награды: 11
Репутация: 7
Статус: Offline
Написать программу, которая осуществляет однонаправленную связь через FIFO между процессом-родителем и процессом-ребенком.

Code
/* Программа Task6.с, осуществляющая однонаправленную связь через   
FIFO между процессом-родителем и процессом-ребенком */   

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main(){
      int FileDescriptor, Result;
      size_t SizeString;
      char StringRead[11];   
      char Name[]="FIFOFile6.fifo";

      (void)umask(0);   

      if(mknod(Name, S_IFIFO | 0666, 0) < 0)
      {
          printf("Can\'t create FIFO\n");
          return -1;   
      }   

      if((Result = fork()) < 0)
      {   
          printf("Can\'t fork child\n");
          return -1;

      } else if (Result > 0)   
      {
          if((FileDescriptor = open(Name, O_WRONLY)) < 0)
   {
              printf("Can\'t open FIFO for writing\n");
              return -1;   
          }
     
          SizeString = write(FileDescriptor, "Check FIFO", 11);
          if(SizeString != 11)
   {
              printf("Can\'t write all string to FIFO\n");           
              return -1;   
          }   

          close(FileDescriptor);
          printf("Parent exit\n");
      } else   
      {
          if((FileDescriptor = open(Name, O_RDONLY)) < 0)
   {
              printf("Can\'t open FIFO for reading\n");
              return -1;   
          }   
          SizeString = read(FileDescriptor, StringRead, 11);
          if(SizeString < 0)
   {
              printf("Can\'t read string\n");   
              return -1;   
          }   
          printf("%s\n",StringRead);
          close(FileDescriptor);
      }
      return 0;   
}


 
_Hz_Дата: Среда, 29.07.2009, 17:35 | Сообщение # 3
Генералиссимус
Группа: Администраторы
Сообщений: 179
Награды: 11
Репутация: 7
Статус: Offline
Написать 2 программы, взаимодействующие между собой с помощью разделяемой памяти.

Первая программа

Code
/* Программа 1 (06-1а.с) для иллюстрации работы с разделяемой памятью */  
/* Мы организуем разделяемую память для массива из трех целых чисел.  
Первый элемент массива является счетчиком числа запусков программы 1,  
т. е. данной программы, второй элемент массива – счетчиком числа запусков
программы 2, третий элемент массива – счетчиком числа запусков обеих  
программ */  
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
int main()
{
     int *array;    /* Указатель на разделяемую память */
     int shmid;     /* IPC дескриптор для области разделяемой памяти */
     int new = 1;   /* Флаг необходимости инициализации элементов массива */
     char pathname[] = "06-1a.c"; /* Имя файла,  
         используемое для генерации ключа. Файл с таким  
         именем должен существовать в текущей директории */
     key_t key;     /* IPC ключ */  
     /* Генерируем IPC ключ из имени файла 06-1a.c в  
         текущей директории и номера экземпляра области  
         разделяемой памяти 0 */
     if((key = ftok(pathname,0)) < 0){
         printf("Can\'t generate key\n");
         exit(-1);
     }
     /* Пытаемся эксклюзивно создать разделяемую память для  
     сгенерированного ключа, т.е. если для этого ключа она
     уже существует, системный вызов вернет отрицательное  
     значение. Размер памяти определяем как размер массива  
     из трех целых переменных, права доступа 0666 – чтение
     и запись разрешены для всех */
     if((shmid = shmget(key, 3*sizeof(int),              
     0666|IPC_CREAT|IPC_EXCL)) < 0){
     /* В случае ошибки пытаемся определить: возникла ли она
     из-за того, что сегмент разделяемой памяти уже существует
     или по другой причине */
         if(errno != EEXIST){
             /* Если по другой причине – прекращаем работу */
             printf("Can\'t create shared memory\n");
             exit(-1);
         } else {
             /* Если из-за того, что разделяемая память уже  
             существует, то пытаемся получить ее IPC  
             дескриптор и, в случае удачи, сбрасываем флаг  
             необходимости инициализации элементов массива */

             if((shmid = shmget(key, 3*sizeof(int), 0)) < 0){
                 printf("Can\'t find shared memory\n");
                 exit(-1);
             }
             new = 0;
         }
     }
     /* Пытаемся отобразить разделяемую память в адресное  
     пространство текущего процесса. Обратите внимание на то,
     что для правильного сравнения мы явно преобразовываем  
     значение -1 к указателю на целое.*/  

     if((array = (int *)shmat(shmid, NULL, 0)) == (int *)(-1)){
         printf("Can't attach shared memory\n");
         exit(-1);
     }
     /* В зависимости от значения флага new либо  
инициализируем массив, либо увеличиваем  
соответствующие счетчики */  
     if(new){
         array[0] = 1;
         array[1] = 0;
         array[2] = 1;
     } else {
         array[0] += 1;
         array[2] += 1;
     }
     /* Печатаем новые значения счетчиков, удаляем  
     разделяемую память из адресного пространства  
     текущего процесса и завершаем работу */
     printf("Program 1 was spawn %d times, program 2 - %d times, total - %d times\n",array[0], array[1], array[2]);
     if(shmdt(array) < 0){  
         printf("Can't detach shared memory\n");
         exit(-1);
     }
     return 0;
}

Вторая программа

Code


/* Программа 2 (06-1b.с) для иллюстрации работы с  
разделяемой памятью */  
/* Мы организуем разделяемую память для массива из
трех целых чисел. Первый элемент массива является  
счетчиком числа запусков программы 1, т. е. данной  
программы, второй элемент массива – счетчиком числа
запусков программы 2, третий элемент массива –  
счетчиком числа запусков обеих программ */  
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
int main()
{
     int *array;   /* Указатель на разделяемую память */
     int shmid;    /* IPC дескриптор для области разделяемой памяти */
     int new = 1;  /* Флаг необходимости инициализации элементов массива */
     char pathname[] = "06-1a.c"; /* Имя файла,  
         используемое для генерации ключа. Файл с таким  
         именем должен существовать в текущей директории */
     key_t key;    /* IPC ключ */  
     /* Генерируем IPC ключ из имени файла 06-1a.c в  
     текущей директории и номера экземпляра области  
     разделяемой памяти 0 */
     if((key = ftok(pathname,0)) < 0){
         printf("Can\'t generate key\n");
         exit(-1);
     }
     /* Пытаемся эксклюзивно создать разделяемую память
     для сгенерированного ключа, т.е. если для этого  
     ключа она уже существует, системный вызов вернет
     отрицательное значение. Размер памяти определяем  
     как размер массива из трех целых переменных, права  
     доступа 0666 – чтение и запись разрешены для всех */
     if((shmid = shmget(key, 3*sizeof(int),  
         0666|IPC_CREAT|IPC_EXCL)) < 0){
     /* В случае возникновения ошибки пытаемся определить:  
     возникла ли она из-за того, что сегмент разделяемой  
     памяти уже существует или по другой причине */
         if(errno != EEXIST){
             /* Если по другой причине – прекращаем работу */
             printf("Can\'t create shared memory\n");
             exit(-1);
         } else {
             /* Если из-за того, что разделяемая память уже
             существует, то пытаемся получить ее IPC дескриптор
             и, в случае удачи, сбрасываем флаг необходимости
             инициализации элементов массива */
             if((shmid = shmget(key, 3*sizeof(int), 0)) < 0){
                 printf("Can\'t find shared memory\n");
                 exit(-1);
             }
             new = 0;
         }
     }
     /* Пытаемся отобразить разделяемую память в адресное  
     пространство текущего процесса. Обратите внимание на то,
     что для правильного сравнения мы явно преобразовываем  
     значение -1 к указателю на целое.*/  
     if((array = (int *)shmat(shmid, NULL, 0)) ==  
         (int *)(-1)){
         printf("Can't attach shared memory\n");
         exit(-1);
     }
     /* В зависимости от значения флага new либо  
     инициализируем массив, либо увеличиваем  
     соответствующие счетчики */  
     if(new){
         array[0] = 0;
         array[1] = 1;
         array[2] = 1;
     } else {
         array[1] += 1;
         array[2] += 1;
     }
     /* Печатаем новые значения счетчиков, удаляем разделяемую
     память из адресного пространства текущего процесса и  
     завершаем работу */
     printf("Program 1 was spawn %d times,program 2 - %d times, total - %d times\n",array[0], array[1], array[2]);
     if(shmdt(array) < 0){  
         printf("Can't detach shared memory\n");
         exit(-1);
     }
     return 0;
}


 
_Hz_Дата: Среда, 29.07.2009, 17:37 | Сообщение # 4
Генералиссимус
Группа: Администраторы
Сообщений: 179
Награды: 11
Репутация: 7
Статус: Offline
Написать программу, использующую 3 нити исполнения.

Code
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
int a = 0;  
void *mythread(void *dummy)
{
     pthread_t mythid, mythid1;  
     mythid = pthread_self();
     a = a+1;
     printf("Нить %d, вычисленное значение = %d\n",mythid, a);
     return NULL;
}

void *mythread1(void *dummy)
{
     pthread_t mythid1;
     mythid1 = pthread_self();
     a = a+1;
     printf("Нить %d, вычисленное значение = %d\n",mythid1, a);
     return NULL;
}

int main()
{
     pthread_t thid, thid3, mythid, mythid1;
     int result;
     result = pthread_create( &thid,(pthread_attr_t *)NULL,mythread,NULL);
     if(result != 0){
     printf ("Ошибка в создании нити, возвращаемое значение = %d\n",result);
     exit(-1);
     }
     printf("Создана нить thid = %d\n", thid);
     /* Запрашиваем идентификатор главного thread'а */
     mythid = pthread_self();
     a = a+1;  
     printf("Нить %d, вычисленное значение = %d\n",mythid, a);
     pthread_join(thid, (void **)NULL);
     /*третья нить*/
     result = pthread_create( &thid3,(pthread_attr_t *)NULL,mythread1,NULL);
     if(result != 0){
     printf ("Ошибка в создании нити, возвращаемое значение = %d\n",result);
     exit(-1);
     }
     printf("Создана нить thid3 = %d\n", thid3);
     mythid1 = pthread_self();
     a = a+1;
     printf("Нить %d, вычисленное значение = %d\n",mythid1, a);
     pthread_join(thid3, (void **)NULL);
     return 0;
}


 
Призрак_сайтаДата: Вторник, 04.08.2009, 00:02 | Сообщение # 5
Сержант
Группа: Друзья
Сообщений: 8
Награды: 0
Репутация: 9
Статус: Offline
Ниасилил O_o

 
Форум » Программирование » ПО ВТ и АС в ДИТУДе » UNIX (программирование в unix системах, использование процессов)
  • Страница 1 из 1
  • 1
Поиск: