GNU/Linux >> Belajar Linux >  >> Linux

Di Lingkungan Kosong, Bagaimana Dapat Dieksekusi Ditemukan?

Untuk tujuan eksperimen, saya membuat biner yang mencetak $PATH , dan memanggil which sebagai berikut:

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

int main() {
    char *path = getenv("PATH");

    if (path)
        printf("got a path: %s\n", path);
    else
        printf("got no path\n");

    system("which which");
    return 0;
}

ketika saya menjalankannya di lingkungan kosong melalui

env -i ./printpath

Saya mendapatkan hasil cetak berikut:

got no path
/usr/bin/which

Pertanyaan saya adalah:mengapa yang benar which biner dipanggil, bahkan jika tidak ada $PATH ?

Jawaban yang Diterima:

Anda telah menggunakan system fungsi, sehingga akan menggunakan shell lain untuk menjalankan perintah which which . Dari man system :

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

Jika Anda mengubah which which perintah untuk echo $PATH :

$ env -i ./a.out 
got no path
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Jika Anda mengubah kode untuk menggunakan execve bukannya system , Anda akan mendapatkan hasil yang diharapkan:

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

int main() {                                                                    
    char *path = getenv("PATH");                                                

    if (path)                                                                   
        printf("got a path: %s\n", path);                                       
    else                                                                        
        printf("got no path\n");                                                

    execve("echo $PATH");                                                       
    return 0;                                                                   
} 

Kompilasi dan jalankan:

$ gcc test.c && env -i ./a.out 
got no path

Linux
  1. Cara memperbaiki kesalahan Perintah tidak ditemukan di Linux

  2. yang:perintah tidak ditemukan

  3. mana python vs PYTHONPATH

  1. Bagaimana cara memeriksa modul apache mana yang diaktifkan/dipasang?

  2. Bagaimana cara mengetahui jalur JVM di sistem Linux?

  3. Bagaimana saya bisa mengedit $PATH di linux?

  1. Cara Memeriksa Modul Apache mana yang Diaktifkan/Dimuat di Linux

  2. Bagaimana Mengetahui Distribusi Linux Yang Anda Gunakan?

  3. Bagaimana cara mengetahui proses mana yang menggunakan ruang swap di Linux?