2011-11-20 32 views
5

Có thể xem các định nghĩa cấu trúc bằng cách sử dụng các trang hướng dẫn cách chúng ta có thể xem các định nghĩa hàm trong UNIX không?Lấy các định nghĩa cấu trúc bằng cách sử dụng các trang của người đàn ông

Ví dụ: đối với lập trình mạng, chúng tôi sử dụng cấu trúc được gọi là struct sockaddr_in. Có anyway để xem làm thế nào sockaddr_in đã được định nghĩa trong thư viện bằng cách sử dụng các trang người đàn ông?

Mọi trợ giúp sẽ được đánh giá cao! Cảm ơn!

+1

Nếu bạn đang sử dụng vim, bạn có thể sử dụng ctags để tạo thẻ của thư mục '/ usr/include' và sau đó chuyển đến thẻ để xem định nghĩa. Nếu không, nó trông giống như một cơ hội tốt cho một dự án nguồn mở! –

Trả lời

2

Tùy thuộc vào chức năng. Ví dụ: bạn có thể nhận định nghĩa của struct sockaddr bằng cách xem man page của bind(2).

Thật không may, không có trang người đàn ông cụ thể cho struct sockaddr.

Các cách khác để lấy thông tin này là tìm kiếm các tệp tiêu đề thích hợp.

+0

Cảm ơn. Nhìn vào các tập tin tiêu đề chắc chắn là một lựa chọn. Nhưng có cách nào để xác định hàm chứa cấu trúc cụ thể không? –

+1

Vâng, tôi đoán tìm kiếm của Google sẽ là một cách tốt. Một cách khác sẽ là [grep] (http://linux.die.net/man/1/grep) cho cấu trúc trong thư mục include của bạn. – Anthony

+0

Tìm kiếm của Google là lựa chọn tốt nhất của tất cả .. lol .. nhưng tiếc là tôi phải làm việc nhiều lần mà không cần kết nối internet trực tiếp. –

1

Và tôi không chắc bạn có thực sự quan tâm: các cuộc gọi hệ thống có thể được xem là xử lý và cung cấp các loại dữ liệu trừu tượng. Ví dụ, ngay cả khi open trả về một số nguyên, nó không có ý nghĩa để tăng số nguyên đó. Vì những lý do như vậy, mô-đun Ocaml Unix mô tả kết quả của open dưới dạng kiểu trừu tượng file_descr, không phải là int (thực tế là).

Nói cách khác, mã C hoặc C++ của bạn nên lý tưởng không thay đổi nếu struct sockaddr_in thay đổi.

+1

Điều đó đúng theo nghĩa, nhưng về các chức năng như [connect] (http://linux.die.net/man/2/connect), nơi bạn cần biết cấu trúc của 'struct sockaddr' và bạn bè để tạo ra kết nối thích hợp. – Anthony

+0

Sau đó, một 'grep -rn2 sockaddr/usr/include' thực tế là đủ (nếu tất cả các gói phát triển giống như' libc6-dev' etc ...- đã được cài đặt). –

2

trang con người chỉ là một tệp được viết bởi con người hoặc được tạo ra bởi mong muốn của con người. Thông thường tất cả các cấu trúc liên quan được đề cập trong các trang con người với các chức năng mà chúng sử dụng. Đôi khi bạn có thể tìm các trang cho các tệp tiêu đề (time.h(0p)). Đôi khi có các trang cho toàn bộ thư viện (libsensors(3)). Đôi khi có các trang thực sự cho cấu trúc (XAnyEvent(3)).

Bạn có thể muốn kiểm tra aproposwhatis. Đôi khi họ có thể tìm các trang liên quan đến những gì bạn đang tìm kiếm.

6

Đối với bất kỳ tiêu đề đưa ra:

echo '#include <netinet/in.h>' | gcc -E - | less 

nào tạo ra sự quan tâm liên quan:

# 225 "/usr/include/netinet/in.h" 3 4 
struct sockaddr_in 
    { 
    sa_family_t sin_family; 
    in_port_t sin_port; 
    struct in_addr sin_addr; 


    unsigned char sin_zero[sizeof (struct sockaddr) - 
     (sizeof (unsigned short int)) - 
     sizeof (in_port_t) - 
     sizeof (struct in_addr)]; 
    }; 

Điều này có thể được thực hiện bằng bất kỳ trình biên dịch với một lựa chọn tiền xử lý (mỗi C biên dịch tôi biết có thể làm được điều này).

1

Đối với bất kỳ tiêu đề đưa ra:

echo '#include <netinet/in.h>' | gcc -E - | less 

nào tạo ra sự quan tâm liên quan:

# 225 "/usr/include/netinet/in.h" 3 4 
struct sockaddr_in 
    { 
    sa_family_t sin_family; 
    in_port_t sin_port; 
    struct in_addr sin_addr; 


    unsigned char sin_zero[sizeof (struct sockaddr) - 
     (sizeof (unsigned short int)) - 
     sizeof (in_port_t) - 
     sizeof (struct in_addr)]; 
    }; 

Điều này có thể được thực hiện bằng bất kỳ trình biên dịch với một lựa chọn tiền xử lý (mỗi C biên dịch tôi biết có thể làm được điều này). Trang hướng dẫn cho sockaddr_inIP(7).

4

Tôi hơi muộn nhưng cấu trúc có liên quan có thể được tìm thấy trong trang người đàn ông của ip, bạn sẽ phải cuộn xuống một chút.ví dụ -

> man ip mang

Address format 
     An IP socket address is defined as a combination of an IP interface address and a 16-bit 
     port number. The basic IP protocol does not supply port numbers, they are implemented 
     by higher level protocols like udp(7) and tcp(7). On raw sockets sin_port is set to the 
     IP protocol. 

      struct sockaddr_in { 
       sa_family_t sin_family; /* address family: AF_INET */ 
       in_port_t  sin_port; /* port in network byte order */ 
       struct in_addr sin_addr; /* internet address */ 
      }; 

      /* Internet address. */ 
      struct in_addr { 
       uint32_t  s_addr;  /* address in network byte order */ 
      }; 

chỉ cần tìm kiếm các trang man liên quan và bạn sẽ tìm thấy nhiều thông tin để bạn tham khảo.

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