Câu hỏi CẬP NHẬT:Python truy cập các chức năng OS API như socket() như thế nào?
đâu đối tượng ổ cắm thực sự được tạo ra? Tôi tìm thấy điều này tại dòng 4188 trong socketmodule.c, nhưng có vẻ như nó được gọi là sock_new không phải socket?
static PyObject *sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Có một số quy ước để tìm ra nơi mô-đun như socketmodule.c được nhập không? Nói cách khác, khi tôi nhìn thấy một "từ _socket import *", tôi biết những gì đang nhập (mà không cần tìm kiếm toàn bộ kho lưu trữ)?
ORIGINAL:
sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Tôi đang cố gắng để hiểu cách mã này hoạt động đặc biệt như thế nào/nơi Python thực sự làm cho các cuộc gọi chức năng hệ điều hành đến socket():
class _socketobject(object):
__doc__ = _realsocket.__doc__
__slots__ = ["_sock", "__weakref__"] + list(_delegate_methods)
def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, _sock=None):
if _sock is None:
_sock = _realsocket(family, type, proto)
self._sock = _sock
for method in _delegate_methods:
setattr(self, method, getattr(_sock, method))
Khi tôi tra cứu ổ cắm BSD trên Wikipedia, tôi thấy ví dụ này có ý nghĩa vì hàm socket được định nghĩa theo types.h. Ở trên tôi thấy một cuộc gọi đến realsocket trông giống như một cuộc gọi chức năng hệ điều hành, nhưng tôi không realsocket định nghĩa bất cứ nơi nào (tôi không thấy bất cứ điều gì về ổ cắm ở tất cả trong các tiêu đề Python27/bao gồm).
/* Server code in C */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(void)
{
struct sockaddr_in stSockAddr;
int SocketFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
Đối với tôi, có một socket.py trong thư mục Python27/lib. Có một số nhận xét trong tệp mô tả các cuộc gọi chức năng nền tảng có sẵn cụ thể. – bornruffians
_realsocket = socket tại https://github.com/certik/python-2.7/blob/master/Lib/socket.py#L100 –
Trong tarball 'Python2.7.10',' Modules/socketmodule.c' line 3192 (in 'sock_initobj' func)' fd = socket (gia đình, kiểu, proto); '.'sock_new' chỉ tạo đối tượng trình bao bọc' Python'. Đối với câu hỏi thứ hai của bạn 'socket.py' chỉ đơn giản là một trình bao bọc trên' _socket.so' và nó phơi bày mọi thứ mà mô-đun năng động thực hiện (+ một vài điều). Bạn có thể nhập trực tiếp '_socket' và xem các thành viên của nó. – CristiFati