Duvida com um Programa em C

Iniciado por Diego_Rocha, 28 de Abril de 2007, 17:55

tópico anterior - próximo tópico

Diego_Rocha

Pessoal é o seguinte eu queria saber por que a bendita função system() nao esta querendo funcionar se alguem tiver ideia fico grato, obrigado t+++


#ifndef _BACK_
#define _BACK_

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

typedef struct _dir {
char *current_dir;
int len;
}_DIR;

int
main ()
{
  _DIR *dir = (_DIR *)malloc(sizeof(_DIR));
  dir->current_dir = (char *)get_current_dir_name();

  dir->len = strlen(dir->current_dir);

  for (dir->len; dir->len >= 0; dir->len--){
  if ( dir->current_dir[dir->len] == '/' )
  break;
  dir->current_dir[dir->len] = '\0';
  }
  char cmd[dir->len + 4];
  sprintf(cmd,"cd %s", dir->current_dir);

  system(cmd);

  return 0;
}
#endif

FOKA

#1
eu ainda nao conheço essa funçao mas vc nao esta infringindo nenhuma regra dela??

nao e system("cmd") ??

s4suk3

Existe o comando cmd em Linux?
Mas é como o FOKA falou:
system("ping 127.0.0.1");
system("killall -9 nautilus);
E por aí vai.
Boa sorte com seu projeto :)
Pentium 4 2.8ghz - 512 RAM DDR 400Mhz -  2 HDs 20gb 7200rpm IDE - Radeon 9200 PRO 128/64 - Arch Linux 2007.09 "Core Dump"
-
Humor, Linux, Software Livre e o resto :P
http://sryche.wordpress.com

FOKA


Diego_Rocha

Citar
char cmd[dir->len + 4];
  sprintf(cmd,"cd %s", dir->current_dir);

cmd é uma variavel, e quando voce passa uma variavel para o comando system() não se usa aspas, por exemplo, char cmd = "echo teste", system(cmd); isso seria equivalente a system("echo teste"), a diferença é que no primeiro exemplo passei uma variavel ao comando system(); no mais obrigado pela tentativa t++

FOKA

ah me desculpa e k ainda estou a introduzir a linguagem por isso e um bocado complicado ajudar:P

tfmoraes

Veja o que eu retirei do manual deste comando, via man:

DESCRIPTION
       system()  executes  a command specified in command by calling /bin/sh
       -c command, and returns after the command has been completed.  During
       execution  of  the  command,  SIGCHLD will be blocked, and SIGINT and
       SIGQUIT will be ignored.

RETURN VALUE
       The value returned is -1 on error  (e.g.   fork()  failed),  and  the
       return status of the command otherwise.  This latter return status is
       in the format specified in wait(2).  Thus, the exit code of the  com-
       mand  will be WEXITSTATUS(status).  In case /bin/sh could not be exe-
       cuted, the exit status will be that of a command that does exit(127).

       If  the  value  of  command is NULL, system() returns non-zero if the
       shell is available, and zero if not.

       system() does not affect the wait status of any other children.

Diego_Rocha

Citação de: tfmoraes online 30 de Abril de 2007, 17:16
Veja o que eu retirei do manual deste comando, via man:

DESCRIPTION
       system()  executes  a command specified in command by calling /bin/sh
       -c command, and returns after the command has been completed.  During
       execution  of  the  command,  SIGCHLD will be blocked, and SIGINT and
       SIGQUIT will be ignored.

RETURN VALUE
       The value returned is -1 on error  (e.g.   fork()  failed),  and  the
       return status of the command otherwise.  This latter return status is
       in the format specified in wait(2).  Thus, the exit code of the  com-
       mand  will be WEXITSTATUS(status).  In case /bin/sh could not be exe-
       cuted, the exit status will be that of a command that does exit(127).

       If  the  value  of  command is NULL, system() returns non-zero if the
       shell is available, and zero if not.

       system() does not affect the wait status of any other children.


Sim cara eu ja li o man varias vezes o problema é o seguinte não sai erro nenhum, ja passei o valor do comando para uma variavel e sai 0, quer disser o comando é executado com sucesso o problema é que o diretorio não muda,

tfmoraes

Tente fazer o comando desejado no console, exemplo:

/bin/sh -c cd Downloads

Ele não muda de diretório. Mas com o comando ls -l ele funciona.

Diego_Rocha


tfmoraes

No man do comando system está escrito que ele executa o comando passado no argumento do seguinte jeito:

/bin/sh -c Comando

Ou seja, se o argumento do system for o comando "ps", ele executará assim:

/bin/sh/ -c ps

mientefuego

Não usa system não...

Parece frescura, mas é deselegante pacas.

Faz o seguinte:

1. Cria um array de char* 's, estatica ou dinamicamente, você que sabe; fica mais bonito dinamicamente.

2. Pega a string de comando q cmd recebe, separa cada palavra em um dessas posições do array. Para isso você pode usar a função strtok, usando como token a string " " (espaço) que tá na biblioteca string.h, que você já incluiu no seu programa.

Esses passos de cima você pode fazer em uma função separada, até prá ficar mais bonito.

3. Na main, se necessário, usa a chamada de sistema fork prá criar um novo processo, e waitpid para o pai esperar a execução do processo-filho.

4. Agora a parte necessária: chame execvp(args[0], args, NULL) para executar o processo novo.

Se você usar o passo 3, colocar isso dentro de um loop infinito ("while(1)"), e implementar entrada via teclado você já tem um micro-shell :D

Diego_Rocha

Citação de: mientefuego online 03 de Maio de 2007, 15:24
Não usa system não...

Parece frescura, mas é deselegante pacas.

Faz o seguinte:

1. Cria um array de char* 's, estatica ou dinamicamente, você que sabe; fica mais bonito dinamicamente.

2. Pega a string de comando q cmd recebe, separa cada palavra em um dessas posições do array. Para isso você pode usar a função strtok, usando como token a string " " (espaço) que tá na biblioteca string.h, que você já incluiu no seu programa.

Esses passos de cima você pode fazer em uma função separada, até prá ficar mais bonito.

3. Na main, se necessário, usa a chamada de sistema fork prá criar um novo processo, e waitpid para o pai esperar a execução do processo-filho.

4. Agora a parte necessária: chame execvp(args[0], args, NULL) para executar o processo novo.

Se você usar o passo 3, colocar isso dentro de um loop infinito ("while(1)"), e implementar entrada via teclado você já tem um micro-shell :D

E ai mientefuego, obrigado por tentar me ajudar o problema é que não tenho nem ideia de como fazer isso tudo que voce falou, se voce pudesse me dar um exemplo ficaria grato t++

jniltinho

Estou tentado usar o glade 2 para gerar codigo em C para o taizan, mas quando eu executo o taizan já compilado em C não aparece os icones

Como eu faço para o C puscar corretamente os icones que estão no Botões do taizan.


QUAL ARQUIVO QUE EU DEVO MUDAR PARA APARECER OS ICONES

/Projetos/glade/src$ ls
callbacks.c  interface.c.bak  main.c       Makefile.in  taizan
callbacks.h  interface.h      main.o       support.c
callbacks.o  interface.h.bak  Makefile     support.h
interface.c  interface.o      Makefile.am  support.o


E em que linha ?

Quem quizer baixar os fontes vou deixar um link
http://taizan.googlecode.com/svn/downloads/glade.tar.bz2

Ele é feito com glade-2; não use o glade-3

Preciso de umas dicas !!!

Diego_Rocha

Ai cara nunca usei o glade, mas pelo que deduzo deve ser no arquivo interface.h e interface.c,