From: C. <al...@br...> - 2000-10-17 02:04:22
|
Olá pessoa, Coders, estou começando a implementação do núcleo do programa (a chamada ao processo filho, execução do pppd, etc). Agora me pintou uma dúvida: Qual o melhor para executar o pppd ??? execl ou system ??? Características do execl: * Linha com tamanho definido (naum dá prá acrescentar argumentos) * Continua a execução do restante do código, mesmo com o programa que foi executado pela função ainda rodando) Características do system: * Monta-se a linha de comando em tempo de execução (fica mais simples de passar argumentos pro pppd) * Programa fica "parado" esperando a chamada à função system terminar (naum executa códigos que estejam depois da chamada ao system antes que o programa executado encerre) --------------->8=============[corta] Bom, é isso aí... Acredito que ambas as funções têm condições de serem utilizadas... mas como só podemos usar uma... :-) Meu voto vai prá função system... (a naum ser que seja REALMENTE necessário executar códigos após a chamada ao pppd). Aguardo sugestões e comentários dos coders... []'s -- André Casteliano Analista de Sistemas +-=-=[ dig...@us...]=-=-+ [ Linux User: # 178853 Machine: # 79923 ] [ Linux Heavy User - Powered by Slackware 7.1 ] [ http://www.geocities.com/andre_casteliano/ ] +-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+ [ LinuxCall - The Linux Dialer ] [ http://linuxcall.sourceforge.net ] +-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+ |
From: Marcelo B. <md...@ma...> - 2000-10-17 02:40:42
|
---[ printf("Em seg, 16 out 2000, André Casteliano escreveu"); ]--- // Olá pessoa, // // Coders, estou começando a implementação do núcleo do programa (a chamada // ao processo filho, execução do pppd, etc). // // Agora me pintou uma dúvida: // // Qual o melhor para executar o pppd ??? execl ou system ??? // // Características do execl: // // * Linha com tamanho definido (naum dá prá acrescentar argumentos) // * Continua a execução do restante do código, mesmo com o programa que // foi executado pela função ainda rodando) // Andre, como assim "linha com tamanho definido"? Não entendi bem essa parte... Outra coisa: voce ja viu sobre execve()? No livro "bla bla bla em 24horas " tem alguns exemplos usando ela, posso te passar na sequencia ou via irc. // Características do system: // // * Monta-se a linha de comando em tempo de execução (fica mais simples // de passar argumentos pro pppd) // * Programa fica "parado" esperando a chamada à função system terminar // (naum executa códigos que estejam depois da chamada ao system antes que // o programa executado encerre) // // --------------->8=============[corta] // // Bom, é isso aí... // // Acredito que ambas as funções têm condições de serem utilizadas... mas // como só podemos usar uma... :-) // // Meu voto vai prá função system... (a naum ser que seja REALMENTE // necessário executar códigos após a chamada ao pppd). Hum.... pano pra manga ai.... Depois do pppd a gente nao vai executar mais nada nao? E os scripts pré e pós discagem? Não é por nada não, mas pra gente que já trabalhou com os forks e afins usar system() me parece meio paia ai ó.... Sera? // Aguardo sugestões e comentários dos coders... // Falow ae sangue bom, abraçao #=-=[ ser...@us... ]=-=+=#=--------------=# | Marcelo D. Beckmann --user[]="#173935"-- | | CL5 2.2.14 | md...@ma... UIN [53189692]----+ | Slack 7 2.2.13 # - =-#--=[ http://marcelobeckmann.cjb.net ]=--#-=======*======-# + .~. | 233MMX 32MB 8.4+3.2GB Quantum Fireball ] /V\ #------------------466.94----[ OPL3SAx TGUI9680 2MB 33600 ] /(.)\ "Estamos de volta aos tempos em que os homens eram homens ] ^`~´^ e programavam seus próprios drivers de dispositivo."L.T. ] #-====-#----=[ serialcoder ]=- + -=[ digital noise dreamer ]=----' |
From: C. <al...@br...> - 2000-10-17 16:03:44
|
Marcelo Beckmann wrote: > > Andre, como assim "linha com tamanho definido"? Não entendi bem essa > parte... > Opa... tamanho definido... tipow: execl(programa,argumento1, argumento2, argumento3, argumentoN...); Mas naum dá prá inserir argumentos em tempo de execução... tipow, dá prá colocar o argumento como sendo uma variável, aí o argumento pode mudar, mas naum podemos ADICIONAR um argumento... tá entendendo ??? > Outra coisa: voce ja viu sobre execve()? > No livro "bla bla bla em 24horas " tem alguns exemplos usando ela, > posso te passar na sequencia ou via irc. Opa... se puder me mandar mais informações sobre ela seria legal... :-) O execve na verdade faz parte de um conjunto de funções... (exec**)... e a execl é uma delas :P > Hum.... pano pra manga ai.... Depois do pppd a gente nao vai > executar mais nada nao? E os scripts pré e pós discagem? O script pós discagem é fácil, o pppd retorna se conseguiu conectar... aí a aplicação-mãe roda o processo... > Não é por nada não, mas pra gente que já trabalhou com os forks e > afins usar system() me parece meio paia ai ó.... System() naum é paia naum! :-P É uma mão na roda quando precisamos executar comandos de shell a partir de um programa C... :P Minha ideía, caros coders, é que o processo-filho (onde vai estar a chamada ao pppd) tenha o mínimo de código... Só mesmo executa o pppd e comunica com o processo-pai via IPC... mais nada. Acho que assim fica melhor... dá prá controlar beleza... E lembrem-se: Os dois processos rodam COMPLETAMENTE em separado... dá prá fazer praticamente QUALQUER coisa... :P Bom, é isso aí... aguardo comentários, []'s -- André Casteliano Analista de Sistemas +-=-=[ dig...@us...]=-=-+ [ Linux User: # 178853 Machine: # 79923 ] [ Linux Heavy User - Powered by Slackware 7.1 ] [ http://www.geocities.com/andre_casteliano/ ] +-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+ [ LinuxCall - The Linux Dialer ] [ http://linuxcall.sourceforge.net ] +-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+ |
From: Marcelo B. <md...@ma...> - 2000-10-18 09:56:44
|
---[ printf("Em ter, 17 out 2000, André Casteliano escreveu"); ]--- // Marcelo Beckmann wrote: // > // > Andre, como assim "linha com tamanho definido"? Não entendi bem essa // > parte... // > // // Opa... tamanho definido... tipow: // // execl(programa,argumento1, argumento2, argumento3, argumentoN...); // // Mas naum dá prá inserir argumentos em tempo de execução... Mas que palha essa função..... // tipow, dá prá colocar o argumento como sendo uma variável, aí o // argumento pode mudar, mas naum podemos ADICIONAR um argumento... tá // entendendo ??? Hum, leia mais pra frente.... // > Outra coisa: voce ja viu sobre execve()? // > No livro "bla bla bla em 24horas " tem alguns exemplos usando ela, // > posso te passar na sequencia ou via irc. // // Opa... se puder me mandar mais informações sobre ela seria legal... :-) // // O execve na verdade faz parte de um conjunto de funções... (exec**)... e // a execl é uma delas :P Mas isso eu sei, hehehe. Elas tem algumas diferenças entre si, mas em essencia destinam-se ao mesmo propósito, depende do que se for fazer... Seguinte, ai vai: -------------[ explicação/resumo sobre execve() ]------------------ #include <unistd.h> int execve(const char *filename, const char *argv[], const char *envp[]); Essa função recebe três argumentos: [*] O nome de arquivo do programa executável binário ou do script do interpretador; [*] O array argv[] a ser passado para o programa; [*] O array envp[] de variáveis de ambiente a exportar; ------------------------[ /execve() ]------------------------------ manja a declaração completa de main? int main(int argc, char **argv) Entao: argc: número de parâmetros passados em linha de comando (ou via execve) para o programa; argv: um vetor de caracteres que contém a linha de comando usada para chamar o programa. Resolvido? Dúvidas? bla bla bla? o argv[] da função execve pode ser um vetor de caracteres que o teu programa monte, ou seja, pode passar os argumentos que você quiser e alterar em tempo de execução os parâmetros e a quantidade deles. Bom, com isso, acho que restam poucas chances pra sobrevivencia do system()... A grande vantagem de execve() em relação ao system() é que o programa chamador (o processo pai) não fica preso, possibilitando um controle melhor das coisas.... // > Hum.... pano pra manga ai.... Depois do pppd a gente nao vai // > executar mais nada nao? E os scripts pré e pós discagem? // // O script pós discagem é fácil, o pppd retorna se conseguiu conectar... // aí a aplicação-mãe roda o processo... Andre, um detalhe ai.... O pppd só retorna quando a conexão terminar. Se o processo pai usar system(), todo o processo pai ficara preso até que o pppd retorne... Ou seja: não será possivel clicar num botão de "desligar" no processo/programa pai, por exemplo, por que o pai estará com o processamento preso durante esse tempo - para liberá-lo, o pppd precisa morrer.... // > Não é por nada não, mas pra gente que já trabalhou com os forks e // > afins usar system() me parece meio paia ai ó.... // // System() naum é paia naum! :-P // // É uma mão na roda quando precisamos executar comandos de shell a partir // de um programa C... :P Tudo depende da abordagem, da situação: * processo filho é "pequeno" ou "grande"; * a execução do processo filho é rápida ou demorada; * o processo pai deverá operar em modo BLOCKING ou NOM BLOCKING; * facilidade de implementação de uma forma ou outra; // Minha ideía, caros coders, é que o processo-filho (onde vai estar a // chamada ao pppd) tenha o mínimo de código... Só mesmo executa o pppd e // comunica com o processo-pai via IPC... mais nada. Via system() creio que não será possivel usar IPC (pelo menos para semaforos, shared memory, e possivelmente pipes). Por que? Por que com system, o processo pai fica preso (modo BLOCKING), e se ele está preso, ele não executa nada, portanto, não poderá acessar um semaforo ou uma shm _enquanto_ o processo filho estiver rodando. // Acho que assim fica melhor... dá prá controlar beleza... Pense bem sobre o system(), dependendo da abordagem ele não será adequado para os propósitos que temos em mente... E o que temos em mente??? Dominar o mundo, claro!!! Não precisa ser amanhã... Pode ser na semana que vem.... hawhuiahawhuiahawhuiahawhuiahawhuiahawhuiahawhuiahawhuiahawhuia (esse negócio de irc vicia.... :) // E lembrem-se: Os dois processos rodam COMPLETAMENTE em separado... dá // prá fazer praticamente QUALQUER coisa... :P Mas isso não acontece com system(), por que enquanto o processo FILHO está RODANDO o processo PAI está PARADO (preso, bloqueado). Uma outra coisa, que eu estou desconfiando que é possível, é que seria possivel o pai ter um controle do processo fiho (matá-lo com kill), o que seria interessante pra implementar um botao de "cancelar" para o usuario poder interromper o pppd e abortar a conexao. Quanto a esse detalhe, ainda preciso confirmar se isso é mesmo possivel, ai quando eu souber eu passo pra voces a informação mais precisa... // Bom, é isso aí... aguardo comentários, Beleza, os meus estão ai. Lembra os fontes do livro blablabla 24 horas que eu te passei? Então, da uma olhada nos do capitulo 18 (arquivos 18LST**.c), tem vários exemplos lá. Mais de noite, no irc, a gente tb pode ver mais sobre isso. Ah, e como é que você tá ai mano? Melhorou da febre e coisa e tal? Tomara que voce melhore o quanto antes, não vejo a hora de te ver no gaz de novo. // []'s // Hurrruuuu! Abração ai tb. -- #=-----------------------+----------------------#---------------=# | Marcelo D. Beckmann -----#173935----* | CL5 2.2.14 | md...@ma... UIN [53189692] | Slack 7 2.2.13 # | =-#--=[ http://marcelobeckmann.cjb.net ]=--#----------------# + +|+ | 233MMX 32MB 8.4+3.2GB Quantum Fireball ] /V\ #--------466.94--------------[ OPL3SAx TGUI9680 2MB 33600 ] /(.)\ "Estamos de volta aos tempos em que os homens eram homens ] ^`~´^ e programavam seus próprios drivers de dispositivo."L.T. ] #------#----=[ serialcoder ]=- + -=[ see me in wm.themes.org ]=--' RTS-[CTS]-DLE-STX-53-18-96-92-CRC-06-66-DLE-ETX-[/CTS]-[RTS]-CTS-[ACK] |
From: C. <al...@br...> - 2000-10-18 22:00:25
|
Marcelo Beckmann wrote: > > -------------[ explicação/resumo sobre execve() ]------------------ > #include <unistd.h> > > int execve(const char *filename, const char *argv[], const char > *envp[]); > > Essa função recebe três argumentos: > [*] O nome de arquivo do programa executável binário ou do script do > interpretador; > [*] O array argv[] a ser passado para o programa; > [*] O array envp[] de variáveis de ambiente a exportar; > > ------------------------[ /execve() ]------------------------------ > > manja a declaração completa de main? manjo... > int main(int argc, char **argv) > A grande vantagem de execve() em relação ao system() é que o programa > chamador (o processo pai) não fica preso, possibilitando um controle > melhor das coisas.... Hum.... isso é interessante. Foi justamente isso que eu ressaltei no primeiro mail: se naum fosse assim tão necessário executar códigos após a chamada ao pppd, a função bem que poderia ser a system()... mas andei lendo as páginas de manual das exec** e elas são mais powered... :P > // > Hum.... pano pra manga ai.... Depois do pppd a gente nao vai > // > executar mais nada nao? E os scripts pré e pós discagem? > // > // O script pós discagem é fácil, o pppd retorna se conseguiu conectar... > // aí a aplicação-mãe roda o processo... > > Andre, um detalhe ai.... > > O pppd só retorna quando a conexão terminar. > > Se o processo pai usar system(), todo o processo pai ficara preso até > que o pppd retorne... Opa. Vc está equivocado meu caro amigo :P Quando executamos o fork() e criamos o processo-filho, a aplicação-mãe continua rodando... independente se o processo filho está "travado" ou não com a função system(). > Ou seja: não será possivel clicar num botão de "desligar" no > processo/programa pai, por exemplo, por que o pai estará com o > processamento preso durante esse tempo - para liberá-lo, o pppd > precisa morrer.... Será possível sim! :P A qualquer momento que se queira, é possível encerrar o processo-filho... leia mais adiante... :-))) > // > Não é por nada não, mas pra gente que já trabalhou com os > forks e // > afins usar system() me parece meio paia ai ó.... > // > // System() naum é paia naum! :-P > // > // É uma mão na roda quando precisamos executar comandos de shell a partir > // de um programa C... :P > > Tudo depende da abordagem, da situação: > * processo filho é "pequeno" ou "grande"; > * a execução do processo filho é rápida ou demorada; > * o processo pai deverá operar em modo BLOCKING ou NOM BLOCKING; > * facilidade de implementação de uma forma ou outra; Hum... isso é vero. Acabei constatando esse detalhe ao ler com mais atenção as man pages dos exec**... Nesse caso, em específico, pouco importa o que o processo-filho irá fazer... naum, eu naum estou ficando maluco. :P O processo filho roda INDEPENDENTE do processo-pai. O processo pai pode até ser encerrado, que o filho continua... sem problemas... > // Minha ideía, caros coders, é que o processo-filho (onde vai > estar a // chamada ao pppd) tenha o mínimo de código... Só mesmo > executa o pppd e // comunica com o processo-pai via IPC... mais nada. > > Via system() creio que não será possivel usar IPC (pelo menos para > semaforos, shared memory, e possivelmente pipes). Por que? > Por que com system, o processo pai fica preso (modo BLOCKING), e se > ele está preso, ele não executa nada, portanto, não poderá acessar um > semaforo ou uma shm _enquanto_ o processo filho estiver rodando. Isso é que é o chato da estória toda... a tal da Intercomunicação entre os processos... vulgo IPC :) Lembra que a gente tava pensando em fazer que nem o "concorrente" (kppp) ??? Eles usam sockets... :) Aí eu fui pesquisar mais sobre isso. Sintam só coders: -------------------------->8=====================[corta] DESCRIPTION Socket creates an endpoint for communication and returns a descriptor. The domain parameter specifies a communication domain; this selects the protocol family which will be used for communication. These families are defined in <sys/socket.h>. The currently understood formats include: PF_UNIX, PF_LOCAL UNIX protocols for local communication ------------------------->8======================[corta] Maneiro, né ? --> UNIX protocols for local communication IPC via sockets... Pesquisando mais um pouquinho... vejam só: ------------------------->8=======================[corta] SOCKETPAIR(2) Linux Programmer's Manual SOCKETPAIR(2) NAME socketpair - create a pair of connected sockets SYNOPSIS #include <sys/types.h> #include <sys/socket.h> int socketpair(int d, int type, int protocol, int sv[2]); DESCRIPTION The call creates an unnamed pair of connected sockets in the specified domain d, of the specified type, and using the optionally specified protocol. The descriptors used in referencing the new sockets are returned in sv[0] and sv[1]. The two sockets are indistinguishable. ------------------------>8=======================[corta] Pelo pouco que eu pude entender nessa olhadela que eu dei, o conceito de sockets para o IPC é extremamente semelhante ao de pipes... Mas naum akeles pipes com popen e tal... são akeles mais "baixo-nível" com pipe(fd); etc... Tem-se uma canal de escrita fd[0] e um canal de leitura fd[1]... Só que nos sockets dá prá retirar mais informações do processo... acho que é isso... Ô Amauri, vc que é fera nesse negócio de sockets... dá uma luz prá gente aki... :PPP > // Acho que assim fica melhor... dá prá controlar beleza... > > Pense bem sobre o system(), dependendo da abordagem ele não será > adequado para os propósitos que temos em mente... Eu já estou descartando o system() devido àquele lance do IPC... > E o que temos em mente??? > > Dominar o mundo, claro!!! > Não precisa ser amanhã... > Pode ser na semana que vem.... > > hawhuiahawhuiahawhuiahawhuiahawhuiahawhuiahawhuiahawhuiahawhuia > > (esse negócio de irc vicia.... :) UAUhAUhAueuhAUhAUhuhAUhAeA vicia mesmo... :) > // E lembrem-se: Os dois processos rodam COMPLETAMENTE em separado... dá > // prá fazer praticamente QUALQUER coisa... :P > > Mas isso não acontece com system(), por que enquanto o processo FILHO > está RODANDO o processo PAI está PARADO (preso, bloqueado). NAO! De uma vez por todas: Processo pai roda independente de processo-filho e vice-versa... Se um morrer, o outro continua sem problemas... > Uma outra coisa, que eu estou desconfiando que é possível, é que > seria possivel o pai ter um controle do processo fiho (matá-lo com > kill), o que seria interessante pra implementar um botao de > "cancelar" para o usuario poder interromper o pppd e abortar a > conexao. > Quanto a esse detalhe, ainda preciso confirmar se isso é mesmo > possivel, ai quando eu souber eu passo pra voces a informação mais > precisa... Bom, naum precisa pesquisar mais. Eis a resposta... :P kill(pid_processo_filho, SIGTERM); E se tiver teimando em naum obedecer a gente pode apelar... kill(pid_processo_teimoso, SIGKILL); :PPP > // Bom, é isso aí... aguardo comentários, > > Beleza, os meus estão ai. Os meus tb... mais algum comentador por aí ? :))) > Lembra os fontes do livro blablabla 24 horas que eu te passei? Lembro sim... vou até comprar esse blablabla em 24 horas... parece ser bem legal... o Volkerding é co-autor... deve ser fodão mermo... :-) > Então, da uma olhada nos do capitulo 18 (arquivos 18LST**.c), tem > vários exemplos lá. Mais de noite, no irc, a gente tb pode ver mais > sobre isso. Legal... vou ver sim... > Ah, e como é que você tá ai mano? Melhorou da febre e coisa e tal? > Tomara que voce melhore o quanto antes, não vejo a hora de te ver no > gaz de novo. Até hoje (quarta) pela manhã eu ainda tava meio baqueado... mas melhorei já e tou voltando ao velho gaz... hehehe > Hurrruuuu! Abração ai tb. Huuurruuuuuu......... é isso manow... vamos nessa! []'s -- André Casteliano Analista de Sistemas +-=-=[ dig...@us...]=-=-+ [ Linux User: # 178853 Machine: # 79923 ] [ Linux Heavy User - Powered by Slackware 7.1 ] [ http://www.geocities.com/andre_casteliano/ ] +-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+ [ LinuxCall - The Linux Dialer ] [ http://linuxcall.sourceforge.net ] +-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+ |