powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Возникла проблемка
23 сообщений из 23, страница 1 из 1
Возникла проблемка
    #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
Возникла проблемка
    #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
Возникла проблемка
    #33765972
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так у тебя основной поток идет по тому же коду что и дочерний.
...
Рейтинг: 0 / 0
Возникла проблемка
    #33765986
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где результат форка равняется нулю, это дочерний. По этому параметру их надо разделять в разные ветки
...
Рейтинг: 0 / 0
Возникла проблемка
    #33765997
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По какому коду? Там ведь printf до развилки, вот в чём фишка то?
...
Рейтинг: 0 / 0
Возникла проблемка
    #33766011
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда, что тебе не нравится в выводе?
...
Рейтинг: 0 / 0
Возникла проблемка
    #33766023
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дак printf, который перед форком, должен вроде всего разок напечататься. Или как?
...
Рейтинг: 0 / 0
Возникла проблемка
    #33766042
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Misha TyurinДак printf, который перед форком, должен вроде всего разок напечататься. Или как?

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

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

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

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

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

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


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

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

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


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

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

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

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

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

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

Просто хочется услышать как там всё это на самом деле реально чё куда передается при "развилке". Сталкнулся с этим и ещё сильнее понял что нифига наверняка не знаю.
...
Рейтинг: 0 / 0
Возникла проблемка
    #33766267
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
Возникла проблемка
    #33766275
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо, вопрос снимаю!
...
Рейтинг: 0 / 0
Возникла проблемка
    #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
Возникла проблемка
    #33766435
Фотография hell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
flush надо делать, перевод строки не обязательно приводит к спросу буфера...

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


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