Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Возникла проблемка / 23 сообщений из 23, страница 1 из 1
01.06.2006, 13:35
    #33765897
Misha Tyurin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возникла проблемка
Мож ктонить сталкивался с подобным эффектом от применения fork'a. Чёто непонятно ничё: както printf странно работает на самом деле.

Вот сырец для опробывания (чёто типа того):

Код: plaintext
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.
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

int main() {

  pid_t fork_ret_val;
  printf( "forking process:" );

  fork_ret_val = fork(); // форк же, ведь развилка!!!

  printf(
    "\n\t" "process id is %d, fork result is %d\n",
    getpid(),
    fork_ret_val
  );
  
  return  0 ;
}

/*
  Вот такой вывод получается (как так?):
   
  forking process:
       process id is XXX, fork result is YYYY
  forking process:
       process id is XXX, fork result is 0
*/


Внимание вопрос! Откуда два раза "forking process:"???

Заранее всем спасибо за участие.
...
Рейтинг: 0 / 0
01.06.2006, 13:42
    #33765924
Misha Tyurin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возникла проблемка
Не, вывод во какой:
Код: plaintext
1.
2.
3.
4.
5.
/*
  forking process:
       process id is XXXX, fork result is YYYY
  forking process:
       process id is YYYY, fork result is 0
*/
...
Рейтинг: 0 / 0
01.06.2006, 13:57
    #33765972
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возникла проблемка
Так у тебя основной поток идет по тому же коду что и дочерний.
...
Рейтинг: 0 / 0
01.06.2006, 13:59
    #33765986
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возникла проблемка
Где результат форка равняется нулю, это дочерний. По этому параметру их надо разделять в разные ветки
...
Рейтинг: 0 / 0
01.06.2006, 14:01
    #33765997
Misha Tyurin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возникла проблемка
По какому коду? Там ведь printf до развилки, вот в чём фишка то?
...
Рейтинг: 0 / 0
01.06.2006, 14:04
    #33766011
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возникла проблемка
Тогда, что тебе не нравится в выводе?
...
Рейтинг: 0 / 0
01.06.2006, 14:07
    #33766023
Misha Tyurin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возникла проблемка
Дак printf, который перед форком, должен вроде всего разок напечататься. Или как?
...
Рейтинг: 0 / 0
01.06.2006, 14:12
    #33766042
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возникла проблемка
Misha TyurinДак printf, который перед форком, должен вроде всего разок напечататься. Или как?

А... че-то я не обратил внимания. Мистика какая-то. У меня такого не было ни разу, и быть такого не может.
...
Рейтинг: 0 / 0
01.06.2006, 14:14
    #33766050
Misha Tyurin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возникла проблемка
Дак ты попробуй то, что я там понаписал, и посмотри... Я тоже удивлён.
...
Рейтинг: 0 / 0
01.06.2006, 14:16
    #33766058
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возникла проблемка
Misha TyurinДак ты попробуй то, что я там понаписал, и посмотри... Я тоже удивлён.

Писал с форками программы и не раз. И все хорошо работало. А попробовать твою - не охота в линух перезагружаться.

Может ты чего-то не догавариваешь?
...
Рейтинг: 0 / 0
01.06.2006, 14:18
    #33766073
Misha Tyurin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возникла проблемка
Может и не договариваю, а фигня такая реально происходит. Почему понять трудно.
...
Рейтинг: 0 / 0
01.06.2006, 14:34
    #33766122
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возникла проблемка
Misha TyurinМожет и не договариваю, а фигня такая реально происходит. Почему понять трудно.

Мне кажется дело вот в чем. У тебя оба потока лезут по одному коду и дружно залазят в принтф, там они карежат данные этого принтэфа, и поэтому результат получается непредскажуем.

Это лишь одна из версий, из-за чего это случается.

Попробуй поставить перед вторым принтэфом слиип на секунду, если это родительский поток
...
Рейтинг: 0 / 0
01.06.2006, 14:39
    #33766142
Возникла проблемка
Akh
Мне кажется дело вот в чем. У тебя оба потока лезут по одному коду и дружно залазят в принтф, там они карежат данные этого принтэфа, и поэтому результат получается непредскажуем.


Оригинал :D это интересно как можно залесть в printf а еще его и покарежить ???
...
Рейтинг: 0 / 0
01.06.2006, 14:40
    #33766144
Misha Tyurin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возникла проблемка
Короче, я уже тут много че делал и с этим кодом и подобными, тут есть вот какя фигня:

!!!! если поставить "\n" выше развилки - ТО ВСЁ РОВНО, как и интуитовно понятно,

а если как я привел в самом начале, то имеем то что получается, ВЫВОД ДВАЖДЫ того что не должно так выводится
...
Рейтинг: 0 / 0
01.06.2006, 14:42
    #33766149
Misha Tyurin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возникла проблемка
Советую попробывать такой код - очень интересно!
...
Рейтинг: 0 / 0
01.06.2006, 15:02
    #33766218
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возникла проблемка
Misha Tyurin
!!!! если поставить "\n" выше развилки - ТО ВСЁ РОВНО, как и интуитовно понятно,


Всмысле, двойного вывода нет? Т.е. во всем виновато то, что буфер вывода был не сброшен?
...
Рейтинг: 0 / 0
01.06.2006, 15:07
    #33766241
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возникла проблемка
AKhдружно залазят в принтф

Шел тут рядышком :)
Оригинал :D это интересно как можно залесть в printf а еще его и покарежить ???

Не менее оригинально
...
Рейтинг: 0 / 0
01.06.2006, 15:07
    #33766242
onstat-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возникла проблемка
Misha TyurinКороче, я уже тут много че делал и с этим кодом и подобными, тут есть вот какя фигня:

!!!! если поставить "\n" выше развилки - ТО ВСЁ РОВНО, как и интуитовно понятно,

а если как я привел в самом начале, то имеем то что получается, ВЫВОД ДВАЖДЫ того что не должно так выводится

Очень даже правильное поведение.
Несброшенный буфер printf наследуется процессом потомком.
...
Рейтинг: 0 / 0
01.06.2006, 15:08
    #33766250
Misha Tyurin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возникла проблемка
Да, как я понимаю этот буфер (точнее его свои копии) оба процесса использовали и когда потом он влешится то и выводится, но оба имеет в буфере первый принтф.

Просто хочется услышать как там всё это на самом деле реально чё куда передается при "развилке". Сталкнулся с этим и ещё сильнее понял что нифига наверняка не знаю.
...
Рейтинг: 0 / 0
01.06.2006, 15:14
    #33766267
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возникла проблемка
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
fork  создает  дочерний  процесс,  который  отличается  от
       родительского   только   значениями   PID   (идентификатор
       процесса) и PPID (идентификатор родительского процесса), а
       также тем  фактом,  что  счетчики  использования  ресурсов
       установлены  в  0.  Блокировки файлов и сигналы, ожидающие
       обработки, не наследуются.

       Под Linux fork реализован с помощью  "копирования  страниц
       при  записи" (copy-on-write, COW), поэтому расходы на fork
       сводятся к копирования таблицы страниц родителя и созданию
       уникальной структуры, описывающей задачу.

Видимо, буфер вывода входит в эти "таблицы страниц"
...
Рейтинг: 0 / 0
01.06.2006, 15:16
    #33766275
Misha Tyurin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возникла проблемка
Всем спасибо, вопрос снимаю!
...
Рейтинг: 0 / 0
01.06.2006, 15:38
    #33766347
onstat-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возникла проблемка
Misha TyurinДа, как я понимаю этот буфер (точнее его свои копии) оба процесса использовали и когда потом он влешится то и выводится, но оба имеет в буфере первый принтф.

Просто хочется услышать как там всё это на самом деле реально чё куда передается при "развилке". Сталкнулся с этим и ещё сильнее понял что нифига наверняка не знаю.

В Linux на самом деле так:

LINUX man fork
fork creates a child process that differs from the parent process only
in its PID and PPID
, and in the fact that resource utilizations are
set to 0. File locks and pending signals are not inherited.

Under Linux, fork is implemented using copy-on-write pages, so the
only penalty incurred by fork is the time and memory required to
duplicate the parent's page tables, and to create a unique task struc-
ture for the child.


В AIX так:

AIX man fork

The fork subroutine creates a new process. The new process (child
process) is an almost exact copy of the calling process (parent
process). The child process inherits the following attributes from the
parent process:
* Environment
* Close-on-exec flags (described in the exec (exec: execl, execle,
execlp, execv, execve, execvp, or exect Subroutine) subroutine)
* Signal handling settings (such as the SIG_DFL value, the SIG_IGN
value, and the Function Address parameter)
* Set user ID mode bit
* Set group ID mode bit
* Profiling on and off status
* Nice value
* All attached shared libraries
* Process group ID
* tty group ID (described in the exit (exit, atexit, unatexit,
_exit, or _Exit Subroutine), atexit, or _exit subroutine, signal
subroutine, and raise subroutine)
* Current directory
* Root directory
* File-mode creation mask (described in the umask subroutine)
* File size limit (described in the ulimit subroutine)
* Attached shared memory segments (described in the shmat
subroutine)
* Attached mapped file segments (described in the shmat subroutine)
* Debugger process ID and multiprocess flag if the parent process
has multiprocess debugging enabled (described in the ptrace
(ptrace, ptracex, ptrace64 Subroutine) subroutine).

The child process differs from the parent process in the following
ways:
* The child process has only one user thread; it is the one that
called the fork subroutine.
* The child process has a unique process ID.

* The child process ID does not match any active process group ID.
* The child process has a different parent process ID.
* Process locks, text locks, and data locks are not inherited by the
child process. For information about locks, see the plock (plock
Subroutine) subroutine.
* If multiprocess debugging is turned on, the trace flags are
inherited from the parent; otherwise, the trace flags are reset.
For information about request 0, see the ptrace (ptrace, ptracex,
ptrace64 Subroutine) subroutine.
* The child process utime, stime, cutime, and cstime subroutines are
set to 0. (For more information, see the getrusage (getrusage,
getrusage64, times, or vtimes Subroutine), times, and vtimes
subroutines.)
* Any pending alarms are cleared in the child process. (For more
information, see the incinterval (getinterval, incinterval,
absinterval, resinc, resabs, alarm, ualarm, getitimer or setitimer
Subroutine), setitimer (getinterval, incinterval, absinterval,
resinc, resabs, alarm, ualarm, getitimer or setitimer Subroutine),
and alarm (getinterval, incinterval, absinterval, resinc, resabs,
alarm, ualarm, getitimer or setitimer Subroutine) subroutines.)
* The set of signals pending for the child process is initialized to
the empty set.
* The child process can have its own copy of the message catalogue
for the parent process.
* The set of signals pending for the child process is initialized as
an empty set. Attention: If you are using the fork or vfork
subroutines with an Enhanced X-Windows, X Toolkit, or Motif
application, open a separate display connection (socket) for the
forked process. If the child process uses the same display
connection as the parent, the X Server will not be able to
interpret the resulting data.

* The child process has its own copy of the file descriptors for the
parent process. However, each file descriptor of the child process
shares a common file pointer with the corresponding file
descriptor of the parent process.
* All semadj values are cleared. For information about semadj
values, see the semop subroutine.



Других Юниксов под рукой нет, предлагаю погугилить самостоятельно.
А поведение у них приблизительно одинаковое.
...
Рейтинг: 0 / 0
01.06.2006, 15:57
    #33766435
hell
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возникла проблемка
flush надо делать, перевод строки не обязательно приводит к спросу буфера...

__________________
For more information, please proceed to http://www.ot-e.biz
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Возникла проблемка / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]