LINUX.ORG.RU

Fork в Perl


0

0

Запускаю параллельную нитку через форк типа: $pid = fork(); if ($pid eq '0') { ... exit; } else { ... }; Далее пытаюсь отследить завершение дочернего задания по ps -A. Все время получается так, что дочернее задание не завершается, а висит с пометкой <defunct>. Как сделать нормальное завершение такой нитки?

Re: Fork в Perl

> Запускаю параллельную нитку через форк
какая еще нитка? fork(2) сделан для создания новых процессов и не имеет отношения к threads(нити). Не знаю что там произходит в perl(perl - говно), но чтобы у тебя нормально завершился child тебе надо либо его похороить когда он выходит или вобще этим чайлдом детачнуться от родителя и жить самому по себе(как делают демоны). Еще, когда твой процесс(парент) выходит то init похоронит всех его зомбарей(если таковые есть).

lg ★★ ()

Re: Fork в Perl

2lg: > perl - говно А какие языки по вашему нормальные/хорошие?

anonymous ()

Re: Fork в Perl

если perl называть языком программирования то:
у него _слишком_ свободный синтаксис, что позволяет писать код(возможно малой 
кровью) в котором сам автор не разберется через 1 час. Язык программирования 
должен вырабатывать стиль написания программ, кторые очень легко читать и 
понимать. Так к пример почему не не нравится GNU C-style(где по 2 или 3 
пробела отступ), а нравится BSD где по 8? Да потому что когда ты делаешь 
большие отступы то тебе дудет самому противно смотреть на код типа типа:

for(i=0;i<100;i++) {
        for (j=0;j<100;j++) {
                while (n) {
                        if (n > 0) {
                                for (k=0;k<4;k++) {
                                        l = preobr(k);
                                        switch (l) {
                                        case 1:
                                                k++;
                                                break;
                                        default:
                                                if (k == 2)
                                                        swtich (x) {
                                                                ...
                                                        }
                                                break;
                                }
                                continue;
                        } else if (n == 0) {
                                for (m=100;m<400;m++)
                                        if (j == 4)
                                                break;
                               }
                               break;
                        }
.............
.............
                          
и ты попытаешься сделать код более красивым визуально, а тем самым 
непроизвольно добьешься того что твой код получится более читабельным и 
понимаемым.

То же касается и perl - синтаксис как мне кажется(я не эксперт в ЯП, но 
занимался этим вопросом некоторое время) должен быть достаточно жестким и 
насколько возможно простым, что позволит с легкостью овладеть этим языком и 
написать программы, а потом легко сравнивать с уже готовыми вещами.

Так же - почему в perl нет интерпритатора(под интерпретатором я понимаю 
понятие что у тебя стейт интерпритатора зависит от предыдущего стейта и 
текущией команды, но не набор стейтов который применяется перед каждой 
командой)? Скорее всего это свидетельствует о том что внутренности перла не 
особо грамотно смоделированы что не позволяет интерпретировать код. как это 
вам нравится когда у вас стейт интерпретатора перед вызовом типа
a = test(4); зависит от последующих после этого вызова вызовов.
Возможно эта бня(отсутствие интерпретатора) результат неких оптимизаций 
которые производит перл во время трансляции кода и составления стейт таблицы.

Главное мне не понятно чему может научить perl. Основная ведь цель для 
изучения нового языка программирования это:
 1) Возможность узнать новые аспекты в программировании.
 2) Возможность решить задачу более простым и/или менее трудоемким способом с 
    учетом времени потраченного на изучение языка.
 3) fun
 4) здесь вставьте что-нибудь свое

Вобщем получаются такие советы:
 1) Кто не знает perl - не учите его
 2) Кто знает и не использует - забудьте его
 3) Кто знает и использует - постараться найти альтернативу
 4) Кто знает, использует и это основной способ решения проблемм - 
    вырабатывайте некую систему по тому как нужно писать на perl, напишите 2 
    программы одну небольшую(10K) вторую побольше (20K) сядьте с другом и 
    разберите вместе как работает первая программа, после того как друг скажет
    что все понял - дайте ему вторую и пусть он разберется в ней 
    самостоятельно, потом разберите ее вместе - если все пучком то у вас 
    отличный стиль и его можно использовать. Лучше даже будет если друг не 
    знаком с perl.

lg ★★ ()

Re: Fork в Perl

> у него _слишком_ свободный синтаксис, что позволяет писать код(возможно малой кровью) в котором сам автор не разберется через 1 час.

Таки месье знает язык, в коем такое дело невозможно?

С уважением -- Смоляное Чучелко

ЗЫ. Да, я вовсе не сторонник Перла...

anonymous ()

Re: Fork в Perl

>у него _слишком_ свободный синтаксис
Это философия перла. И это правильно. Вы можете писать как ВАМ удобнее.

> что позволяет писать код(возможно малой кровью) в котором сам автор
>не разберется через 1 час.
Это проблема не языка а автора.

>Язык программирования должен вырабатывать стиль написания программ,
>которые очень легко читать и понимать.
Опять же язык вам ничего не должен. Это вы ему должны.

>Так к пример почему не не нравится GNU C-style(где по 2 или 3
>пробела отступ), а нравится BSD где по 8?
вот и оформляй свои перл-программы в GNU C-style, тебе же никто не мешает.
Не имеет значение в каком стиле оформленна программа. Главное чтобы она БЫЛА оформленна.

>и ты попытаешься сделать код более красивым визуально, а тем самым
>непроизвольно добьешься того что твой код получится более
>читабельным и понимаемым.
Правильно. Делай это и в перле. Не смотри на чужие поделки.

>То же касается и perl - синтаксис как мне кажется(я не эксперт в ЯП,
>но занимался этим вопросом некоторое время) должен быть достаточно
>жестким и насколько возможно простым, что позволит с легкостью
>владеть этим языком и написать программы, а потом легко сравнивать с
>уже готовыми вещами.
Синтаксис на самом деле довольно жесткий. Просто ты этого не замечаешь. Кстати твой критерий "жесткости"?

>Так же - почему в perl нет интерпритатора
Наверное потому что это не интерпритируемый язык. И не скрипт как говорят некоторые. Это ПОЛНОЦЕННЫЙ язык. И программа на самом деле компилируется во внутренний код, который потом интерпритируется.

>Скорее всего это свидетельствует о том что внутренности перла не
>особо грамотно смоделированы что не позволяет интерпретировать код.
No comments

>Главное мне не понятно чему может научить perl. Основная ведь цель
>для изучения нового языка программирования это:
> 1) Возможность узнать новые аспекты в программировании.
Поздравляю. Это наверное для тебя новость но изучая любой язык ты узнаешь новые аспекты.

> 2) Возможность решить задачу более простым и/или менее трудоемким
>способом с учетом времени потраченного на изучение языка.
Перл - рулез. Легко и просто.

> 3) fun
Ты точно хочешь учить перл, судя по твоим требованиям.
4) здесь вставьте что-нибудь свое
Вставляю: чтобы говорить о перле надо его немного знать.


>Вобщем получаются такие советы:
> 1) Кто не знает perl - не учите его
Кто не знает таблицу умножения - не учите ее. Есть калькуляторы. Они быстрее и надежнее. Китайские версии - очень дешевы.

> 2) Кто знает и не использует - забудьте его
Точно. Китайские...

> 3) Кто знает и использует - постараться найти альтернативу
Кита..

> 4) Кто знает, использует и это основной способ решения проблемм -
> вырабатывайте некую систему по тому как нужно писать на perl,
> напишите 2 программы одну небольшую(10K) вторую побольше (20K)
> сядьте с другом и разберите вместе как работает первая
> программа, после того как друг скажет что все понял - дайте ему
> вторую и пусть он разберется в ней самостоятельно, потом
> разберите ее вместе - если все пучком то у вас отличный стиль и
> его можно использовать. Лучше даже будет если друг не знаком с
> perl.
Напишите небольшую программу на С. Потом покажите ее мне. Я плохо знаком с С но попытаюсь вас понять. Потом напишите 2. Я попытаюсь разобратся в ней самомтоятельно. Делее варианты:
1)я плохо знаю С и не пойму во второй вашей программе что такое break
2)я знаю С но я не понимаю что делает ваша программа. Какието циклы, вызовы неизвестных мне библиотечных функций.
3)я знаю С но я не понимаю что делает ваша программа. Может надо было комментариев парочку написать.
4)я знаю С и понимаю что делает ваша программа. Построчно. Но не понимаю как. Я незнаком с интерполяцией методом .... Я собственно не знаю даже что такое интерполяция.
5)- Ой, не компилится.
- Может у меня не вас компилятор?
- А что они разные????
и т.д.

Может не стоит ругать язык который незнаешь?
Или по другому: у плохого танцора и руки неровные.

Немного знающий перл.

anonymous ()

Re: Fork в Perl

2anonymous (*) (2002-12-18 14:16:25.822)
единственно стоящий коментарий:
> Наверное потому что это не интерпритируемый язык. И не скрипт
> как говорят некоторые. Это ПОЛНОЦЕННЫЙ язык. И программа на
> самом деле компилируется во внутренний код, который потом
> интерпритируется.
дада - он транслируется во внутренний код который после этого интерпретирутеся в соответствии с таблицей стейтов - это не полноценный язык - это не полноценный интерпретатор :)

lg ★★ ()

Re: Fork в Perl

>Запускаю параллельную нитку через форк типа
Да это не нитка. Но надо всетаки ответ нормальный дать. 
1)Ты просто перепутал результат fork`а. Он возращает '0' если ты child. Наверное ты хотел демона сделать. Если это так то вот пример.

#!/usr/bin/perl
use POSIX;

$pid = fork();
#If i am children?
if($pid eq '0'){
    #Close owners handles
    close(STDIN);
    close(STDOUT);
    close(STDERR);
    #I am not terminal programm. Closing session or die.
    POSIX::setsid() or die 'Can`t start new session';
    while(1){sleep(1000)};
}else{
    #All ok.
    if($pid){
        print STDERR "Daemon started.\n";
    }else{
        print STDERR "Error: cannot fork.\n";
    }
    exit;
};

2)Ты не хотел демона. Их в мире и так хватает. Да вот еще и зомби плодятся :) Попробуем избавится от них. Прямо по книге:
'Если вам не нужно регистрировать завершившихся потомков, используйте:
$SIG{CHLD}='IGNORE'
Такой вариант устроит? Вот пример:

#!/usr/bin/perl
$SIG{CHLD}='IGNORE';
$pid = fork();
if ($pid eq '0'){
    print "I am child. I must die!\n";
    exit;
}else{
    while(1){
        sleep(1);
        print "Perl - rulez!\n";
    }
}


Немного знающий перл.

anonymous ()

Re: Fork в Perl

> Немного знающий перл.
зато как класно ты умеешь писать perl script который постит мессаги на lor :) быстро и просто и небось еще в себе имеет шедулер который через определенные(рандомные) промежутки времени отдает управление кому попало?

:))

lg ★★ ()

Re: Fork в Perl

>дада - он транслируется во внутренний код который после этого >интерпретирутеся в соответствии с таблицей стейтов - это не
>полноценный язык - это не полноценный интерпретатор :)

Да, то ли дело ява...
А вам не кажется что единственный РЕАЛЬНЫЙ компилятор - это asm?
Ведь и C, и pascal и ... на самом деле переводят код в некий асм, который потом компилится?
А С если уж на то пошло делает это два раза, сначала собственно в С, а потом а асм.

anonymous ()

Re: Fork в Perl

>зато как класно ты умеешь писать perl script который постит мессаги на
>lor :) быстро и просто и небось еще в себе имеет шедулер который через
>определенные(рандомные) промежутки времени отдает управление кому
>попало?

Мой шедулер называется Супер-страна-Украина-Со-своим-Супер-провайдером
а в качестве примочки еще галеон использую

anonymous ()

Re: Fork в Perl

2lg:
дык все таки какой язык посоветуете, я все таки спросил не зря, т.к. начинающий кодер? жалательно, конечно, списочек с краткой характеристикой, плз, если не затруднит.

anonymous ()

Re: Fork в Perl

2anonymous (*) (2002-12-18 17:32:47.248)
даже и не знаю .. если ты совсем первый язык собираешься учить то я посоветовал бы Python на какой нибудь Unix системе.
у меня вобще вот так все происходило(насколько я сейчас припоминаю):
basic - очень мне нравился .. но я тогда еще маленький был (3-й класс)
asm - обалденная вещь
pascal - хороший язык, даже 2.5d движок на нем писал
c - супер вещь
lisp - охуеть фишка
sml - модная хрень
haskel (ознакомление) - понравился, но я его на практике так и не применил ни разу :(
python - do you subscribed to cp4e? :)
perl - не понравилось, хотя народ говорит что это круто.
clips - классная вещь для соответствующих задач
forth (ознакомление) - прикольная вещь, но не знаю насколько forth можно называть ЯП - помоему он им не является.
prolog - после прочтения "ТПН" Успенского :)

с фортраном так и не столкнулся :)

lg ★★ ()

Re: Fork в Perl

> Да, то ли дело ява...
> А вам не кажется что единственный РЕАЛЬНЫЙ компилятор - это
> asm?
> Ведь и C, и pascal и ... на самом деле переводят код в некий
> асм, который потом компилится?

> А С если уж на то пошло делает это два раза, сначала
> собственно в С, а потом а асм.
эээ погоди .. это зависит от отого чем ты этот С файл обрабатываешь. Если компилятором то из С сразу в объектник. Ну понятно что пробегаемся сначала cppой по нему а потом в объектник - никаких asm. А если это какой нибудь c2a(типа С to asm) транслятор - то пожалуйста .. эту хрень конечно тоже можно назвать компилятором но с некоторыми оговорками.


lg ★★ ()

Re: Fork в Perl

Неа. Я о другом. С не в обектник гонит. Он сначала в асм гонит, а его в обектник.
Пример. File hello.c:
int main(void){
printf("Hello world!\n");
}
Далее под линухом:
gcc -save-temps hello.c
Получаем файлы:
1)hello.i
*********************************************************************
# 1 "hello.c"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "hello.c"
int main(void){
printf("Hello world!\n");
}
*********************************************************************
2)hello.s
*********************************************************************
.file "hello.c"
.section .rodata
.LC0:
.string "Hello world!\n"
.text
.align 2
.globl main
.type main,@function
main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
movl $0, %eax
subl %eax, %esp
subl $12, %esp
pushl $.LC0
call printf
addl $16, %esp
leave
ret
.Lfe1:
.size main,.Lfe1-main
.ident "GCC: (GNU) 3.2 (Mandrake Linux 9.0 3.2-1mdk)"
*********************************************************************
3)a.out
бинарник, извините приводить его не буду.

For windows:
cl.exe /FA hello.c

Получаем hello.asm:
*********************************************************************
TITLE hello.c
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
_DATA SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA ENDS
CONST SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS ENDS
_TLS SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS ENDS
FLAT GROUP _DATA, CONST, _BSS
ASSUME CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC _main
EXTRN _printf:NEAR
_DATA SEGMENT
$SG33 DB 'Hello world!', 0aH, 00H
_DATA ENDS
_TEXT SEGMENT
_main PROC NEAR
; File hello.c
; Line 1
push ebp
mov ebp, esp
; Line 2
push OFFSET FLAT:$SG33
call _printf
add esp, 4
; Line 3
pop ebp
ret 0
_main ENDP
_TEXT ENDS
END
*********************************************************************
Я что-то не то сделал?
Или может компилер он еще и как дебугер работает?
А, наверное я не тем компилятором пользовался. Извините у меня нет других.

З.Ы: Из паскалей у меня тока freepascal. Запускать так:
fpc -a hello.pas

anonymous ()

Re: Fork в Perl

Забыл подписатся. Может и вправду зарегестрится?


Немного знающий перл.

anonymous ()

Re: Fork в Perl

2anonymous (*) (2002-12-18 19:15:16.364):
Сам язык не определяет че и как делать с файлом исходника.
gcc польше нравится прогонять его через несколько этапов .. но это не обязывает всех делать точно также.


lg ★★ ()

Re: Fork в Perl

Что-то мы с колеи сошли.
Перл тоже не определяет.
А еще есть такая чтука как perlcc. Правда very experimental. Но все у нас впереди.
Да кстати можно пример компилера который не через асм гонит?
Со ссылочкой. Чтобы скачать можно было. Под лин или вынь.

Заранее благодарю
Ваш Немного знающий перл.

anonymous ()

Re: Fork в Perl

> .. не через асм гонит?
да сам напиши на перле :)

lg ★★ ()

Re: Fork в Perl

Эх Итого ставим точку. Ответ на основной вопрос дан. На дополнительные - всеми уважаемый ЛГ отвечать не хочет. Финита. ЗЫ: а задумайтесь почему большинство компилеров тем или иным способом в асм гонит? Немного знающий перл.

anonymous ()

Re: Fork в Perl

гнать в asm удобнее нежели в объектник сразу, потому что тебе не надо знать в каком формате у тебя будет конечный файл .. бывают разные форматы объектников, так же в них по разному хранятся симовлы для дебагера и информация для дебагера.(и вообще посоветовал бы тебе все таки написать какой нибудь транслятор[такой опыт никогда не повредит] например для какого-нибудь своего языка. Чёрч бы сказал что у тебя получится(почти 90%) "универсальный" язык :) ).

Вообще можно было бы сделать какой то определенный мета формат объектных файлов который бы генерили компилеры, а потом из него получались бы всевозможные объектники. Так вот этим мета форматом как раз является асмовый код в данном контексте.

lg ★★ ()

Re: Fork в Perl

Да а ссылочки нету....
А на до то всеголишь ченить старенькое, одноплатформенное вспомнить.
И не удержусь чтобы не напомнить ваши слова:

>эээ погоди .. это зависит от отого чем ты этот С файл обрабатываешь. >Если компилятором то из С сразу в объектник.
>Ну понятно что пробегаемся сначала cppой по нему а потом в объектник -
> никаких asm. А если это какой нибудь c2a(типа С to asm) транслятор -
>то пожалуйста .. эту хрень конечно тоже можно назвать компилятором но
>с некоторыми оговорками.
>lg

Ваш немного знающий перл.

ЗЫ: я всетаки зарегестрился.

roller ★★★ ()
Ответ на: Re: Fork в Perl от anonymous

Re: Re: Fork в Perl

Так. Всем замолчать и идти курить dragonbook (то есть, "Compilers: Principles, Techniques, and Tools" Ахо, Сети и Ульмана). Чтоб потом дурацкие вопросы не задавать.

Antichrist ()

Re: Fork в Perl

хватит гнать, на перле можно сделать заполнение и редакцию 100(3 страницы занимает только объявление переменных) параметров(каждого в отдельности или сколько надо) через вебинтерфейс без использования библиотек на 2 страницах кода(включая туда html)... напишите мне так-же кратко на любом языке. Задолбали меня эти тупые наезды... не знаете языка, не говорите. Чтобы перл узнать по настоящему на нем надо минимум два года писать очень плотно. Я вот три пишу(ненапряжно) и дай бог что 1/10 перла знаю... Его фишка в том, что ты делаешь все что хочешь и как хочешь...

vilfred ☆☆ ()
22 января 2004 г.
Ответ на: Re: Fork в Perl от vilfred

Re: Re: Fork в Perl

>на перле можно сделать заполнение и редакцию 100 параметров через вебинтерфейс без использования библиотек на 2 страницах кода (включая туда html)... напишите мне так-же кратко на любом языке.

Также кратко, а может даже более кратко (смотря что ты имел в виду под "заполнением параметров через вебинтерфейс") можно написать на PHP, например:))

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