C işlevi arama unix yolu

oy
1

Bir UNIX kabuk programlama ediyorum ve kullanmak zorunda execv()bir süreç yaratmak için sistem çağrısı. Için parametrelerden biri execv()yürütülebilir için filepath olduğunu. Yani birileri türleri ise /bin/ls, bu çalışacaktır lsyürütülebilir. Fakat benim ihtiyacım olduğunda, öyle ki bir fonksiyondur lsyazıldığında, bunun yolu için arayacaktır ls(gibi whichkomuta). Bana bunu sağlayan bir işlevi var mı?

Ne yazık ki, bu bir okul projesi olan bir ben kullanmak için izin değilim execvp(). Ben FilePath bazı yol arama fonksiyonu ve daha sonra addon uygulamak gerekir execv()parametresi.

Oluştur 29/09/2008 saat 01:16
kaynak kullanıcı
Diğer dillerde...                            


9 cevaplar

oy
4

Kullan PATH = getenv("PATH")daha sonra ardışık çağrıları kullanın ortamdan yol dizesini almak için strtok(PATH,":")daha sonra strtok(NULL,":")gelen yolları ayrıştırmasını PATHbir diziye dize char **pathsizinle ayırması gerekir, malloc(). Yer path[x]+ '/'+ argv[0]bir tampon içine, ve kullanımı access(buffer, X_OK), böylece gerçekleştirmek eğer, bu yol yerde dosyanızı yürütebileceği olmadığını görmek için execv(buffer,argv).

Cevap 29/09/2008 saat 14:33
kaynak kullanıcı

oy
3

Eğer execvp kullanamıyorsanız, içinden YOL değişkeni alabilir char** environdan <unistd.h> ya char* getenv(const char* name)dan <stdlib.h> sonra kullanmak int access(const char* filename, int mode)dosya var ve çalıştırılabilir olup olmadığını görmek için. Bir okul projesi olarak sana uygulanmasını bırakacağım.

Cevap 29/09/2008 saat 01:29
kaynak kullanıcı

oy
2

Birkaç kişi aramak ileri sürmüşlerdir access()veya stat()ile program çalıştırmak denemeden önce execv(). Bunu yapmak için gerek yoktur. execv()istenen dosyayı yürütmek edemeseydik bir hata döndürür.

Cevap 30/09/2008 saat 01:38
kaynak kullanıcı

oy
2

Sen dosya adı bir '/' içermediği sürece execvp (), bu PATH değişkeninde belirtilen yolu arayacaktır istiyorum.

Cevap 29/09/2008 saat 01:20
kaynak kullanıcı

oy
1

Kullanın execvp.

char *args[] = {"ls", (char *) NULL};
execvp("ls", args);

mesela bu örnek exec olacak /bin/echo(varsayarak /binPATH üzerindedir).

#include <unistd.h>

int main()
{
    char *args[] = {"echo", "hello world", (char *) NULL};
    execvp("echo", args);
    return 0;
}
Cevap 29/09/2008 saat 01:27
kaynak kullanıcı

oy
1

Ben execvp () ne ihtiyacınız yok düşünüyorum.

Düzenleme: Aslında elle Bunun nasıl Yani soruyorsun? Bu durumda...

  1. () (Ana kadar 3 argümanı) ekleyin ortam içinde PATH bulun
  2. tek tek yolların içine bu böl
  3. Stat () ile bunların her birinde programınızın özendirdiği için kontrol edin
  4. Eğer var olmaya bulmak ilkini Yürütme

Eğer bir olsun istiyorsanız gerçekten katı uygulanmasını kullanmak bu . Gerçi intihal dedektörleri yola olabilir :)

Cevap 29/09/2008 saat 01:18
kaynak kullanıcı

oy
0

execvp adam sayfasından:

   The  functions  execlp() and execvp() will duplicate the actions of the
   shell in searching for an executable file  if  the  specified  filename
   does  not  contain  a slash (/) character.  The search path is the path
   specified in the environment by the PATH variable.   If  this  variable
   isn’t specified, the default path ‘‘:/bin:/usr/bin’’ is used.  In addi-
   tion, certain errors are treated specially.

Belki) (execlp kullanmasına izin verilir? Eğer PATH ortam değişkeninin değerini almak gerekir execv Eğer kullanmanız gerekiyorsa, bireysel yolları olsun her yolu için dosya adını eklemek için Strtok () kullanarak bu ayrıştırmak ve execv ile yürütme girişiminde ().

Ben kodu sağlayacağında, ama senin için ödevini yapmıyorum.

Cevap 29/09/2008 saat 01:26
kaynak kullanıcı

oy
0

execvp :-)

Düzenleme: Tamam. İşte sorun için pseudocode olarak hizmet edebilir bir Perl versiyonu bulunuyor.

use List::Util qw(first);

my @path = split /:/, $ENV{PATH};
my $dir = first {$_ ||= '.'; -x "$_/$name"} @path
    or die "Can't find program $name\n";
exec "$dir/$name", @args;

splitVerilen ayırıcı kullanarak dize dizisi, içine bir dize böler. firstBazı kritere uyum ilk öğe bulur; Burada, dizinin birleştirme ve isim aranmaktadır o yürütülebilir ( -x). Daha sonra bu çalıştırır.

Umarım yardımcı olur!

Cevap 29/09/2008 saat 01:20
kaynak kullanıcı

oy
-1

Bir okul projesi Ah ...

Bir şey istersen "hangi gibi" neden sadece çalıştırılamaz "hangi" kendisi (/ usr / bin / linux üzerinde, olmasın, kabuk diğer adı veya tcsh yerleşik olan) Aradığınız ne yolunu almak için ...

:-)

Cevap 29/09/2008 saat 18:13
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more