Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Небольшая задача.  (Прочитано 4171 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн E-Not

  • Автор темы
  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Небольшая задача.
« : 26 Октября 2008, 23:05:23 »
Господа. Встала следующая задача.

"Процесс 1 открывает файл и порождает потомков 2 и 3. Потомки пишут в файл по N байт и завершают работу. После этого процесс 1 считывает данные из файла и выводит на экран."

в линуксе недавно, поэтому не очень понимаю то что выдает мне поиск((
Прога нужна в сях.
Заранее всем спосибо..
« Последнее редактирование: 26 Октября 2008, 23:08:35 от E-Not »

Оффлайн tolstyj

  • Участник
  • *
  • Сообщений: 186
    • Просмотр профиля
Re: Небольшая задача.
« Ответ #1 : 26 Октября 2008, 23:18:07 »
Господа. Встала следующая задача.

"Процесс 1 открывает файл и порождает потомков 2 и 3. Потомки пишут в файл по N байт и завершают работу. После этого процесс 1 считывает данные из файла и выводит на экран."

в линуксе недавно, поэтому не очень понимаю то что выдает мне поиск((
Прога нужна в сях.
Заранее всем спосибо..


Тебе нужно написать программу на С?

Или что?

Thread

  • Гость
Re: Небольшая задача.
« Ответ #2 : 26 Октября 2008, 23:20:29 »
Смотреть fork(), waitpid(), стандартные функции. Погуглить туториал по UNIX-программированию.

Оффлайн E-Not

  • Автор темы
  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Небольшая задача.
« Ответ #3 : 26 Октября 2008, 23:25:11 »
Народ еси не трудна, помогите кодом плиз...Очень нада...

Оффлайн sht0rm

  • Старожил
  • *
  • Сообщений: 3397
    • Просмотр профиля
Re: Небольшая задача.
« Ответ #4 : 26 Октября 2008, 23:40:17 »
E-Not
:) типа сделайте за меня задание по программированию? :)))

Оффлайн E-Not

  • Автор темы
  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Небольшая задача.
« Ответ #5 : 27 Октября 2008, 00:08:06 »
E-Not
:) типа сделайте за меня задание по программированию? :)))
просто попросил помочь, так как у самого не получается...

Оффлайн axe

  • Старожил
  • *
  • Сообщений: 1203
    • Просмотр профиля
Re: Небольшая задача.
« Ответ #6 : 27 Октября 2008, 00:35:04 »
вот и спрашивай, что не получается, а не проси сделать за тебя всю работу  ;)

Оффлайн E-Not

  • Автор темы
  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Небольшая задача.
« Ответ #7 : 27 Октября 2008, 21:26:21 »
Получается нечто подобное:
#include <sys/types.h>
#include <fcntl.h>
#include <stdio.h>
int fd1, fd2;
int pid2, pid3, st, i, n;
char* buffer;
char ch = 'a';
void main(int argc, char *argv[])
{
if (argc < 4)
{
puts("File no found.");
}
                else
                {   
n = atoi(argv[2]);
fd1 = open(argv[1], O_CREAT | O_WRONLY);
pid2 = fork();
if (pid2 == 0)/* process 2 */
{     
for (i = 0; i < n; i++)
{
write(fd1, &ch, sizeof(char));
ch++;
}
}
else /* process 1 */
{
pid3 = fork();
if (pid3 == 0) /* process 3 */
{
for (i = 0; i < n; i++)
{
write(fd1, &ch, sizeof(char));
ch++;
}
}
waitpid(pid2, &st, 0);
waitpid(pid3, &st, 0);
close(fd1);
fd2 = open(argv[1], O_RDONLY);
read(fd2, buffer, 2*n);
printf("Process buffer %s:", buffer);
close(fd2);
}
}
exit(0);
}
« Последнее редактирование: 27 Октября 2008, 22:35:21 от E-Not »

Thread

  • Гость
Re: Небольшая задача.
« Ответ #8 : 27 Октября 2008, 21:52:07 »
Получается нечто подобное:
#include <sys/types.h>
#include <fcntl.h>
#include <stdio.h>
int fd1, fd2;
int pid2, pid3, st, i, n;
char* buffer;
char ch = 'a';
void main(int argc, char *argv[])
{
if (argc < 4)
{
puts("File no found.");
}
                else
                {   
n = atoi(argv[2]);
fd1 = open(argv[1], O_CREAT | O_WRONLY);
pid2 = fork();
if (pid2 == 0)/* process 2 */
{     
for (i = 0; i < n; i++)
{
write(fd1, &ch, sizeof(char));
ch++;
}
wait(&st);
}
else /* process 1 */
{
pid3 = fork();
if (pid3 == 0) /* process 3 */
{
for (i = 0; i < n; i++)
{
write(fd1, &ch, sizeof(char));
ch++;
}
wait(&st);
}
wait(&st);
close(fd1);
fd2 = open(argv[1], O_RDONLY);
read(fd2, buffer, 2*n);
printf("Process buffer %s:", buffer);
close(fd2);
}
}
exit(0);
}

Мне одному кажется, что самый первый форк пишет что-то и засыпает, ожидая одного из своих потомков, которых нет? -)

Оффлайн E-Not

  • Автор темы
  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Небольшая задача.
« Ответ #9 : 27 Октября 2008, 21:56:00 »
вполне может быть)) тогда второй тоже самое делает) просто у меня рядом нет никакой Unix ОС чтобы все это дело проверить...

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Небольшая задача.
« Ответ #10 : 27 Октября 2008, 22:18:29 »
просто у меня рядом нет никакой Unix ОС чтобы все это дело проверить...
putty?

Оффлайн E-Not

  • Автор темы
  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Небольшая задача.
« Ответ #11 : 27 Октября 2008, 22:25:42 »

Оффлайн Saha

  • Активист
  • *
  • Сообщений: 517
    • Просмотр профиля
Re: Небольшая задача.
« Ответ #12 : 27 Октября 2008, 22:27:38 »
Зачем у потомков стоит wait()? Им надо ставить exit(0) или лучше ничего не ставить.

upd:
Вместо wait() надо использовать waitpid два раза (для каждого потомка)
waitpid(pid2,&status,0)
waitpid(pid3,&status,0)
или два раза wait() =)
« Последнее редактирование: 27 Октября 2008, 22:36:05 от Saha »

Оффлайн E-Not

  • Автор темы
  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Небольшая задача.
« Ответ #13 : 27 Октября 2008, 22:29:45 »
Зачем у потомков стоит wait()? Им надо ставить exit(0) или лучше ничего не ставить.
Мы выше уже выяснили, что wait() не нужен))

Оффлайн E-Not

  • Автор темы
  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Небольшая задача.
« Ответ #14 : 27 Октября 2008, 22:47:57 »
E-Not
а вот этого не стоило писать. :)) Теперь желания помогать вообще нет.
Андрей, надеюсь без вашей помощи справлюсь))

 

Страница сгенерирована за 0.092 секунд. Запросов: 25.