LINUX.ORG.RU

Обьясните суть происходящего при добавлении в stdout «\n»

 , ,


0

7

Первый вариант:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
 
int main() 
{
 
  printf("1234 ");
  fork();
  exit(0);
}
Выхлоп предсказуем:
faust@localhost 1]$ ./2
1234 1234 [faust@localhost 1]$
Второй вариант:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
 
int main() 
{
 
  printf("1234 \n");
  fork();
  exit(0);
}
Выхлоп удивил:
[faust@localhost 1]$ ./2
1234 
[faust@localhost 1]$

Может кто-то объяснит что да как?

З.Ы. Собирал просто: gcc -o 2 2.c

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 2)
Ответ на: комментарий от anonymous

Не угадал :) 3572^2=12759184
По поводу решения уравнения верно, но есть ли оно? Школу закончил давно и решать енто уравнение(подбирать параметры) нет никакого желания.
Скорее всего ответ кроется в нюансах написания проги, где-то допущена ошибка и верного результата не будет, а прога завершится
С питоном я никак (ну парочка хеловордов). Просто хотел показать дебилиз задачек яндекса, как и абсолютно неправильное применение fork`а в примере выше.
P.S. Я, к стати, подставив в printf(«%i»,getpid()) добивался трёх состояний: нет вывода вообще :rolf: , вывод только от папы и вывод обоих (это в терминал без перенаправления). При этом не было никакой перекомпиляции - работала одна и таже прога.
Все эти результаты говорят о разном возможном поведении из-за неверного применения fork(состояние потомка никак не отслеживается, буфер общий, факт рождения потомка тоже не отслеживается, «папа» не ожидает конца жизни «сына» и пр.). Эдди уже намекал на демонизацию «отпрыска».

drfaust ★★★★★
() автор топика
Ответ на: комментарий от drfaust

т.е. если сделать так:

#include<stdio.h>
#include<sys/types.h>

int main(void)
{
    pid_t pid;
    switch (pid = fork()) {
        case -1:
            exit(-1);
            break;
        case 0:
            while(1) {
                sleep(1);
                printf("child\n");
            }
            break;
        default:
            exit(0);
    }
    return 0;
}

то «child» не будет печататься? или один раз вылезет и все?

momo
()
Ответ на: комментарий от momo

Будет долбить постоянно, пока не пошлёшь к-либо сигнал на завершение, например kill -HUP...

drfaust ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.