LINUX.ORG.RU

Fork в Perl


0

0

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

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

lg ★★
()

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

anonymous
()

если 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 ★★
()

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

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

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

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

anonymous
()

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

> что позволяет писать код(возможно малой кровью) в котором сам автор
>не разберется через 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
()

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

lg ★★
()

>Запускаю параллельную нитку через форк типа
Да это не нитка. Но надо всетаки ответ нормальный дать. 
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
()

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

:))

lg ★★
()

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

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

anonymous
()

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

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

anonymous
()

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

anonymous
()

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 ★★
()

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

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


lg ★★
()

Неа. Я о другом. С не в обектник гонит. Он сначала в асм гонит, а его в обектник.
Пример. 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
()

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


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

anonymous
()

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


lg ★★
()

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

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

anonymous
()

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

lg ★★
()

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

anonymous
()

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

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

lg ★★
()

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

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

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

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

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

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

Antichrist
()

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

vilfred ☆☆
()
22 января 2004 г.
Ответ на: комментарий от vilfred

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

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

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