Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
 Аватар для VisualNIK
8 / 8 / 4
Регистрация: 29.10.2012
Сообщений: 167

Прошу оценки

29.11.2013, 07:17. Показов 1190. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru