2013-05-27 46 views
6

Tôi biết rằng khi lập trình bằng C++ tôi có thể truy cập các biến môi trường riêng lẻ với getenv.Cách liệt kê tất cả các biến môi trường trong ứng dụng c/C++

Tôi cũng biết rằng, trong thiết bị đầu cuối os x, tôi có thể liệt kê TẤT CẢ các biến môi trường hiện tại bằng cách sử dụng env.

Tôi quan tâm đến việc nhận danh sách đầy đủ các biến môi trường có sẵn cho chương trình đang chạy C++ của tôi. Có chức năng c/C++ nào sẽ liệt kê chúng? Nói cách khác, có cách nào để gọi env từ mã C++ của tôi không?

+2

Sự kỳ diệu đang ở đây: [env.c] (http://minnie.tuhs.org/cgi-bin/utree.pl?file=OpenSolaris_b135/cmd/env/ env.c). – dasblinkenlight

+0

Lệnh shell là 'env', không phải' ENV' (Tôi đã chỉnh sửa câu hỏi của bạn để sửa lỗi đó). –

Trả lời

10

Sử dụng các biến toàn cầu environ. Nó là một con trỏ null kết thúc với một chuỗi các chuỗi ở định dạng name=value. Dưới đây là một bản sao thu nhỏ của env:

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

extern char **environ; 

int main(int argc, char **argv) { 
    for(char **current = environ; *current; current++) { 
     puts(*current); 
    } 
    return EXIT_SUCCESS; 
} 
+0

Thật vậy. 'man getenv' có ở phía dưới (trên OS X, trong đó OP đề cập đến) phần' SEE ALSO' đề cập đến 'environ (7)'. Vì vậy, 'man environ' cung cấp một manpage giải thích điều này. 'môi trường apropos' cũng bao gồm cả trang này. Điều này không có nghĩa là RTFM, nhưng gợi ý cho OP rằng các phần 'SEE ALSO' của manpages có thể đáng để kiểm tra. –

11

Bạn có thể sử dụng phi di envp lập luận để main:

int main(int argc,char* argv[], char** envp) 

và như một phần thưởng rõ ràng trên OSX bạn có apple mang đến cho bạn khác hệ điều hành cung cấp thông tin:

int main(int argc, char **argv, char **envp, char **apple) 

Nhưng nó được sử dụng để làm gì? Vâng, Apple có thể sử dụng véc tơ táo để chuyển bất kỳ thông số "ẩn" nào mà họ muốn vào bất kỳ chương trình nào. Và họ cũng thực sự sử dụng nó. Hiện tại, apple [0] chứa đường dẫn nơi tìm thấy nhị phân thực hiện trên đĩa. Bạn nói gì vậy? Làm thế nào là táo [0] khác với argv [0]? Sự khác biệt là argv [0] có thể được đặt thành bất kỳ giá trị tùy ý nào khi thực thi (2) được gọi. Ví dụ, vỏ thường phân biệt một vỏ đăng nhập từ một vỏ thường xuyên bằng cách bắt đầu vỏ đăng nhập với ký tự đầu tiên trong argv [0] là một -

0

Rất tiếc, tôi quên rằng system cho phép bạn thực hiện các lệnh terminal.

đoạn này mang lại cho tôi những gì tôi cần:

std::cout << "List of environment variables: << std::endl; 
system("env"); 
+0

Điều đó không làm cho biến có sẵn cho chương trình của bạn, nó chỉ in chúng vào đầu ra tiêu chuẩn. –

Các vấn đề liên quan