LINUX.ORG.RU

Привет, я нуб!

 


0

1

Решил попробовать в потроха линукса, и почти с ходу при написании программ-ковырялок напоролся на необ'яснимое.

Вот, допустим, код:

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

void main()
{
   int i;
   for (i = 0; i < 10; i++)
      {
         (void)fork();
         if (i=10) printf("%d %d\n\n", getpid(), getppid());
      };
}
Казалось бы, у первого процесса родителем должен быть терминал, а у второго - первый. Ан нет! Периодически родителем второго процесса оказываюсь лично я.

wtf@wtf-pc:~$ ./a.out
15601 15464

15602 15601

wtf@wtf-pc:~$ ./a.out
15603 15464

15604 2055

Но прочему?


Рискну предположить, что сие действие происходит внутри контейнера и 2055 - это init процесс. В любом случае пляши от того, что процесс №1 умирает может умереть раньше, чем его дочерний процесс(№2).

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

Логично, спасибо! А почему при одинаковом алгоритме раньше в одних случаях завершаетсяребёнок, а в других - родитель?

И да, дошло, процесс 2055 - это мой init, всё внезапно сходится.

2055 ? Ss 0:00 init --user

WTF
() автор топика

Казалось бы, у первого процесса родителем должен быть терминал, а у второго - первый. Ан нет! Периодически родителем второго процесса оказываюсь лично я.

Ого! Вот это поворот, поздравляю, чего уж.

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

Я просто слепой, не заметил в описании процесса слово «init». Иливы хотите сказать,что я нуб?

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

А почему при одинаковом алгоритме раньше в одних случаях завершаетсяребёнок, а в других - родитель?

Используется более одного аппаратного потока?

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

Да, похоже на то, процессор двухядерный. Спасибо!

WTF
() автор топика

Если родительский процесс завершается раньше дочерних, их «удочеряет» init.

Legioner ★★★★★
()
Ответ на: комментарий от teod0r
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:02 /sbin/init
 2055 ?        Ss     0:00 init --user

Возможно, этосвязано с тем, что программа была запущена из xterm. А может и нет.

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

Дык откуда ж мне знать? Я компьютер третий раз в жизни вижу! Два инита, два инита...

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

Ээээ... Вообще-то это не должно было работать. Интересно, почему тогда я честно получал две пары чисел.

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

Забористая штука этот ваш Си! Достаточно немного подправить программу, чтобы она наглухо вешала систему при запуске из-под обычного пользователя :)

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

Теперь можно отлить в граните.

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

void main()
{
   int i;
   for (i = 0; i < 10; i++)
      {
         (void)fork();
         wait(NULL);
         if (i == 9) printf("%d %d\n\n", getpid(), getppid());
      };
   
}

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

Теперь можно отлить в граните.

Нет, сначала определи именованную константу вместо 10, а в if подставь эту же константу минус 1 :) Для такого простого кода это, вероятно, излишне, но лучше вырабатывать хорошие привычки.

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

нескромный вопрос: зачем в (void)fork() собственно (void)?

кроме того бросаются в глаза: точка с запятой после фигурных скобок, и определение i вне цикла, хоть и не нужно нигде вне цикла

AndreyKl ★★★★★
()
Последнее исправление: AndreyKl (всего исправлений: 1)
Ответ на: комментарий от AndreyKl

Затем, что в стандартах разных лет си разный. Ну и компилятор будет доволен.

anonymous
()
14 сентября 2016 г.

И снова

На этот раз решил посчитать, какой размер pipe, записывая в него, пока не переполнится. В общем-то даже получилось, 65536, но программа затыкается при попытке записи в переполненный буфер. Почему? Должна же просто вернуть 0 записанных байт, нет?

Вот:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>

void main(){
    int fd[2];
    long i;
    size_t size;
    i = 0;
    pipe(fd);
    size = write(fd[1], "", 1);
    while (size == 1){
        i++;
        printf("%li\n",i);
        size = write(fd[1], "", 1);
    };
    close(fd[0]);
    close(fd[1]);    
}

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