Аватар для VisualNIK
8 / 8 / 4
Регистрация: 29.10.2012
Сообщений: 167

Прошу оценки

29.11.2013, 07:17. Показов 1199. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть следующее задание:
Открыть файл и записать в него первое сообщение(«Hello »). После разветвления процесса в
дочернем записать в файл второе сообщение(«World»). Выполнить программу, просмотреть
созданный файл и объяснить результат. Что будет, если попытаться закрыть файл в
дочернем процессе, а в родительском после ожиданияwait(child_pid) записать в файл третье
сообщение?

Реализовал его следующим образом:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[]){
        FILE* file = fopen("/home/nivit/nikita/test/lab2/f","w");
        int child = fork();
 
        if(child > 0){
                fprintf(file,"Hello ");
        }
 
        if(child == 0){
                fprintf(file,"World!");
                fclose(file);
                exit(1);
        }
        fclose(file);
 return(0);
}
Хотел бы выслушать (если найдутся) какие-либо замечания, заметки. Может что-то не совсем корректно, хотя и работает...просто хочу до конца понять fork() c его обращением к родительскому и дочернему процессу...В дочерний отправляется файловый поток с "Hello " в нем, а там добавляется "World" или же как-то по другому это работает...буду очень признателен если будет пошаговое описание, т.к. есть сложенная в голове теория, хотелось бы сравнить с правдой..Спасибо!

Добавлено через 18 минут
А лучше, если объясните вот этот вариант:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[]){
        FILE* file = fopen("/home/nivit/nikita/test/lab3/f","w");
 
        int child = fork();
 
        if(child > 0){
                fprintf(file,"Hello ");
                fclose(file);
        }
 
        if(child == 0){
                fprintf(file,"World!");
                exit(1);
        }
 return(0);
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.11.2013, 07:17
Ответы с готовыми решениями:

Прошу оценки железяки
Тип ЦП QuadCore Intel Core i7-4790K, 4200 MHz (42 x 100) Системная плата Asus Z97-P (2 PCI, 2 PCI-E x1, 2 PCI-E x16, 1 M.2, 4 DDR3...

Прошу Вашей оценки.
Создал социальную сеть для пользователей интернета, для общения, обмена информацией. Прошу Вас уважаемые дать совет стоит ли развивать...

Прошу оценки сайта
Здравствуйте, уважаемые оптимизаторы! Прошу оценить сайт www.myprom.ru, сайт является промышленным порталом. Главный трафик идет на...

11
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
29.11.2013, 14:31
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    FILE* fd = fopen("temp","w"); 
 
    //собственно ветвление
    int child = fork();
 
    if(child > 0)
    {
        //мы в процесе родителя
        //записали в файл
        fprintf(fd, "Hello ");
        //закрыли файл
        //при этом это не влияет на порожденный процес
        //и его таблицу дискрипторов
        fclose(fd);
    }
    else if (child == 0)
    {
        //мы в процессе дитя
        //мы унаследовали файловые дискрипторы (descriptor)
        //а значит можем писать в файл
        //но мы не унаследовали описание о файле (description)
        //поэтому дальше неопределенное поведение, так как произойдет гонка
        //за запись в файл.
        fprintf(fd, "world!\n");
        exit(1);
    }
    else
    {
        //ошибка
    }
 
    return 0;
}
1
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
29.11.2013, 15:10
Цитата Сообщение от nvdrossii Посмотреть сообщение
В дочерний отправляется файловый поток с "Hello " в нем, а там добавляется "World" или же как-то по другому это работает
fclose и exit можно убрать из дочернего и просто оставить в конце.
Как выше правильно написал stima, возникнет гонка. С открытым файлом в системной таблице у тебя связано смещение, которое указывает куда данные будут писаться. Когда ты пишешь в файл что-то, смещение меняется (не всегда это верно). Поэтому следующая запись будет писать данные в файл с новой позиции. В твоем примере возможно 4 варианта:
1. Родительский процесс написал Hello и успел обновить смещение в таблице открытых файлов. Дочерний допишет World! по новому смещению. Получится "Hello World!"
2. Родительский процесс написал Hello и не успел обновить смещение в таблице открытых файлов, и запустился дочерний процесс. Дочерний допишет World! по старому смещению, которое указывает на начало файла. Получится, что World! перезапишет Hello и будет просто "World!"
То же самое, если первым запустился дочерний процесс. Либо он напишет "World!" и успеет обновить смещение - "World!Hello", либо не успеет обновить смещение, тогда "Hello " перезапишет "World!" и останется "Hello "
Как-то так должно работать.
1
 Аватар для VisualNIK
8 / 8 / 4
Регистрация: 29.10.2012
Сообщений: 167
29.11.2013, 16:43  [ТС]
В общем в итоге, так как по заданию написано Открыть файл -> записать в него "Hello " -> разветвить процесс на два и в дочернем записать в него "World!", я сделал следующие:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[]){
        FILE* file = fopen("/home/nivit/nikita/test/lab3/f","w");
        fprintf(file,"Hello ");
        fclose(file);
        int cp = fork();
        if(cp == 0){
                file = fopen("/home/nivit/nikita/test/lab3/f","a+");
                fprintf(file,"World!");
                fclose(file);
                exit(0);
        }
 
 return(0);
}
т.е. я отрыл и закрыл файл в родительском и открыл и закрыл в дочернем, а можно ли все сделать за одно открытие?
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
29.11.2013, 16:59
Я думаю от Вас требовалось следующие.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
    FILE* fd = fopen("temp", "w");
    
    int pid = fork();
    if (pid < 0)
    {
        perror("Fork error\n");
        return 1;
    }
 
 
    if (pid > 0)
    {
        //parent
        fprintf(fd, "Hello");
    }
    if (pid == 0)
    {
        //child
        int status;
        wait(&status);
 
        fprintf(fd, " world!\n");
    }
 
    fclose(fd);
 
    return 0;
}
0
 Аватар для VisualNIK
8 / 8 / 4
Регистрация: 29.10.2012
Сообщений: 167
29.11.2013, 17:01  [ТС]
stima, не пойму: объявляем status а дальше его ждем...а чего ждем??? если статусу ничего не присваивали.
Да, но в задании выделено именно: Открыть файл и записать в него первое сообщение(«Hello »). После разветвления процесса в дочернем записать в файл второе сообщение(«World»).
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
29.11.2013, 17:48
Ждем завершение чайлда, спрашивайте у мужика. Если по условию, тогда Вы правы.
0
 Аватар для VisualNIK
8 / 8 / 4
Регистрация: 29.10.2012
Сообщений: 167
29.11.2013, 17:50  [ТС]
stima, в чайлде ждем завершения чайлда (if pid == 0 ведь)? Так работает. Кстати я похожее писал, только без wait. Я хочу просто понять как можно лучше все.
Т.е. если по условию, тогда не получится так что бы не открывать и закрывать файл в обоих процессах?
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
29.11.2013, 18:05
кхм ... в паренте ждем завершение чайлда (я ошибся) ...
а по вопросу, наверное можно, но я Вам не подскажу. Гуглите в сторону изменений дискриптора и/или опций открытия с блокировками и т.д..
1
 Аватар для VisualNIK
8 / 8 / 4
Регистрация: 29.10.2012
Сообщений: 167
29.11.2013, 18:22  [ТС]
stima, если wait сделать в parent тогда там выходит:
world!
Hello

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
    FILE* fd = fopen("/home/nivit/nikita/test/lab3/f", "w");
 
    int pid = fork();
    if (pid < 0)
    {
        perror("Fork error\n");
        return 1;
    }
 
 
    if (pid > 0)
    {
        //parent
        fprintf(fd, "Hello");
        wait(pid);
    }
    if (pid == 0)
    {
        //child
        fprintf(fd, " world!\n");
    }
 
    fclose(fd);
 
    return 0;
}
судя по всему чайлд раньше срабатывает, что ли...(исходя из постов выше)
0
29.11.2013, 19:22

Не по теме:

Еще забыл вариант с World!Hello

0
40 / 37 / 15
Регистрация: 25.10.2012
Сообщений: 112
01.12.2013, 01:50
Цитата Сообщение от nvdrossii Посмотреть сообщение
судя по всему чайлд раньше срабатывает, что ли...(исходя из постов выше)
Естественно. Вызывая wait, Вы блокируете родительский процесс до завершения процесса-потомка. Поэтому сначала будет записано world!, и лишь потом - Hello.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.12.2013, 01:50
Помогаю со студенческими работами здесь

Сборка на AMD FX прошу оценки
Здравствуйте форумчане.Прошу оценки моего будущего бюджетного апгрейда компьютера.Имеется в наличии:видео ATI Radeon 6930 1gb ddr5,БП power...

Прошу оценки и совета в подборе комплектующих к ПК
1) Бюджет - 150 - 170тр 2) Игры в 4к( монитор в сборку не входит) 3) Без апгрейда в ближайшие 5 лет. 4) Разгон будет(гнаться будет в...

Уважаемая публика, прошу вашей оценки=)
&lt;p&gt;Сайт подруги (попросила в меру сил и способностей заняться им):&lt;/p&gt;&lt;p&gt;http://perfectum.spb.ru/&lt;/p&gt;&lt;p&gt;Собственно, что...

Сборка игрового ПК. прошу оценки 75000 рублей
Доброго времени суток. Я из Таллинна. Прошу оценить и высказать свое мнение о данной комплектации на сколько все...

Определить количество дней, в которых оценки меньше средней оценки по классу
в массиве записаны оценки по информатике 22 учеников класса. Определить количество дней, в которых меньше средней оценки по классу, и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru