nixp.ru v3.0

21 января 2017,
суббота,
16:22:57 MSK

DevOps с компанией «Флант»
Uncle Theodore написал 13 февраля 2005 года в 20:28 (264 просмотра) Ведет себя неопределенно; открыл 58 тем в форуме, оставил 1537 комментариев на сайте.

Че-то я туплю, однако. Почему вот эта прога

#include 
#include 
#include 
#include 
void increment(int *number)
{
  (*number)++;
};
void decrement(int *number)
{
  (*number)--;
};
int main()
{
  pid_t pid; //could be int pid
  int i, *ptr  = (int *)malloc(sizeof(int));
  if(ptr == NULL)
    {
      printf("Mem error, bailing out!\n");
      return 1;
    };
  *ptr = 0;
  if((pid = fork())) //parent
    {
      for(i=0;i<5;i++)
      {
        increment(ptr);
        printf("PARENT: Incrementing *ptr %i to %i\n", ptr, *ptr);
      };
    }
  else //child
    {
      for(i=0;i<5;i++)
      {
        decrement(ptr);
        printf("CHILD: Decrementing *ptr %i to %i\n", ptr, *ptr);
      };
    };
  free(ptr);
  wait(NULL);
  return 0;
};

выдает

CHILD: Decrementing *ptr 134520912 to -1

CHILD: Decrementing *ptr 134520912 to -2

CHILD: Decrementing *ptr 134520912 to -3

CHILD: Decrementing *ptr 134520912 to -4

CHILD: Decrementing *ptr 134520912 to -5

PARENT: Incrementing *ptr 134520912 to 1

PARENT: Incrementing *ptr 134520912 to 2

PARENT: Incrementing *ptr 134520912 to 3

PARENT: Incrementing *ptr 134520912 to 4

PARENT: Incrementing *ptr 134520912 to 5

??? Ведь поинтер-же один *и* тот *же?!!* Как же он указывает на разные области памяти? Я хочу, чтобы родитель и дитятко курочили тот же самый int.

И можно ли вообще заставить два форканутых процесса пользоваться общими ресурсами? (не файлами). Про threads знаю, о них следующий вопрос.

Good Luck,

UT

iliya

Нельзя, они в разных областях памяти валяются.

Это всё копии родителя.

Решение — PIPE.

Genie

Грабельки под названием COW — Copy-On-Write в действии ;))

До момента записи — страницы физически одно и тоже

А как только один из процессов записал что-то — так и скопировалось у второго.

use /dev/shm ;)

sas

На самом деле Вам надо использовать любой IPC (shared memory — идеально)

Uncle Theodore

Понятно. Читаю про System V IPC. Проблема была в разных address space’ах, как Genie сказал, корова она и есть корова. Всем большое спасибо.

Кстати. На каких курсах вы все это проходили? Если меня оставят на полную ставку на факультете CS, мы будем немного менять нашу программу (я уже задрал главу департмента рассказами про то, как наши студенты плохо программируют, не понимают процессов построения и реализации алгоритма, не знают теории, там всяких P и NP). Он согласился ввести еще один курс, алгоритмы, но этого мало. Надо еще что-то про работу с памятью, процессами, scheduler’ами и прочим. не все ж ASP изучать…

Good Luck,

UT

decvar

Я IPC и прочая проходил на третьем курсе. По предмету «Системное програмное обеспечение»

decvar

Текст не по теме:

Ну почему когда на форуме спашивают что-нить дельное — меня нету и поучаствовать не успеваю, а как какой-нить спам или рекламу постят — так я тут… ну что за карма такая? Чакру что ли почистить?

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.