GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana menerapkan readlink untuk menemukan jalan

Jawaban yang diterima hampir benar, kecuali Anda tidak dapat mengandalkan PATH_MAX karena

tidak dijamin akan ditentukan per POSIX jika sistem tidak memiliki batas tersebut.

(Dari readlink(2) halaman manual)

Juga, ketika didefinisikan, itu tidak selalu mewakili batas "sebenarnya". (Lihat http://insanecoding.blogspot.fr/2007/11/pathmax-simply-isnt.html )

Halaman manual readlink juga memberikan cara untuk melakukannya di symlink :

Menggunakan penyangga berukuran statis mungkin tidak menyediakan cukup ruang untuk konten tautan simbolik. Ukuran yang diperlukan untuk buffer dapat diperoleh dari nilai stat.st_size yang dikembalikan oleh panggilan ke lstat(2) pada tautan. Namun, jumlah byte yang ditulis oleh readlink() dan read‐linkat() harus diperiksa untuk memastikan bahwa ukuran tautan simbolis tidak bertambah di antara panggilan.

Namun dalam kasus /proc/self/exe/ untuk sebagian besar file /proc, stat.st_size akan menjadi 0. Satu-satunya solusi tersisa yang saya lihat adalah mengubah ukuran buffer jika tidak sesuai.

Saya menyarankan penggunaan vector<char> sebagai berikut untuk tujuan ini:

std::string get_selfpath()
{
    std::vector<char> buf(400);
    ssize_t len;

    do
    {
        buf.resize(buf.size() + 100);
        len = ::readlink("/proc/self/exe", &(buf[0]), buf.size());
    } while (buf.size() == len);

    if (len > 0)
    {
        buf[len] = '\0';
        return (std::string(&(buf[0])));
    }
    /* handle error */
    return "";
}

Ini Gunakan fungsi readlink() dengan benar untuk penggunaan yang benar dari readlink fungsi.

Jika Anda memiliki jalur Anda di std::string , Anda dapat melakukan sesuatu seperti ini:

#include <unistd.h>
#include <limits.h>

std::string do_readlink(std::string const& path) {
    char buff[PATH_MAX];
    ssize_t len = ::readlink(path.c_str(), buff, sizeof(buff)-1);
    if (len != -1) {
      buff[len] = '\0';
      return std::string(buff);
    }
    /* handle error condition */
}

Jika Anda hanya mencari jalur tetap:

std::string get_selfpath() {
    char buff[PATH_MAX];
    ssize_t len = ::readlink("/proc/self/exe", buff, sizeof(buff)-1);
    if (len != -1) {
      buff[len] = '\0';
      return std::string(buff);
    }
    /* handle error condition */
}

Untuk menggunakannya:

int main()
{
  std::string selfpath = get_selfpath();
  std::cout << selfpath << std::endl;
  return 0;
}

Mari kita lihat apa yang dikatakan halaman manual:

 readlink() places the contents of the symbolic link path in the buffer
 buf, which has size bufsiz.  readlink does not append a NUL character to
 buf.

OKE. Seharusnya cukup sederhana. Mengingat buffer Anda dari 1024 karakter:

 char buf[1024];

 /* The manpage says it won't null terminate.  Let's zero the buffer. */
 memset(buf, 0, sizeof(buf));

 /* Note we use sizeof(buf)-1 since we may need an extra char for NUL. */
 if (readlink("/proc/self/exe", buf, sizeof(buf)-1) < 0)
 {
    /* There was an error...  Perhaps the path does not exist
     * or the buffer is not big enough.  errno has the details. */
    perror("readlink");
    return -1;
 }

Linux
  1. Cara Mengetahui Apakah Disk Adalah SSD Atau HDD Di Linux

  2. Cara mengaudit izin dengan perintah find

  3. Cara mem-pipe hasil 'find' ke mv di Linux

  1. Temukan URL File

  2. bagaimana menemukan jalur HADOOP_HOME di Linux?

  3. Bagaimana menemukan jalur instal git di Mac atau Linux?

  1. Cara Menggunakan Perintah find Linux untuk Menemukan File

  2. Bagaimana cara menemukan lokasi yang dapat dieksekusi di C?

  3. cara menemukan pemilik file atau direktori dengan python