Че-то я туплю, однако. Почему вот эта прога
#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
Последние комментарии
- OlegL, 17 декабря 2023 года в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
Нельзя, они в разных областях памяти валяются.
Это всё копии родителя.
Решение — PIPE.
Грабельки под названием COW — Copy-On-Write в действии ;))
До момента записи — страницы физически одно и тоже
А как только один из процессов записал что-то — так и скопировалось у второго.
use /dev/shm ;)
На самом деле Вам надо использовать любой IPC (shared memory — идеально)
Понятно. Читаю про System V IPC. Проблема была в разных address space’ах, как Genie сказал, корова она и есть корова. Всем большое спасибо.
Кстати. На каких курсах вы все это проходили? Если меня оставят на полную ставку на факультете CS, мы будем немного менять нашу программу (я уже задрал главу департмента рассказами про то, как наши студенты плохо программируют, не понимают процессов построения и реализации алгоритма, не знают теории, там всяких P и NP). Он согласился ввести еще один курс, алгоритмы, но этого мало. Надо еще что-то про работу с памятью, процессами, scheduler’ами и прочим. не все ж ASP изучать…
Good Luck,
UT
Я IPC и прочая проходил на третьем курсе. По предмету «Системное програмное обеспечение»
Текст не по теме:
Ну почему когда на форуме спашивают что-нить дельное — меня нету и поучаствовать не успеваю, а как какой-нить спам или рекламу постят — так я тут… ну что за карма такая? Чакру что ли почистить?