溫馨提示×

C++ Linux系統調用詳解

小樊
68
2025-04-08 02:25:39
欄目: 編程語言

在Linux系統中,C++程序可以通過系統調用(syscalls)與操作系統內核進行交互。系統調用是用戶空間程序請求內核服務的一種機制。它們提供了一系列基本功能,如文件操作、進程控制、通信等。

以下是一些常用的Linux系統調用及其在C++中的使用方法:

1. 文件操作

  • open(): 打開一個文件。

    #include <fcntl.h>
    int fd = open("example.txt", O_RDONLY);
    if (fd == -1) {
        perror("open");
    }
    
  • read(): 從文件描述符讀取數據。

    char buffer[1024];
    ssize_t bytesRead = read(fd, buffer, sizeof(buffer));
    if (bytesRead == -1) {
        perror("read");
    }
    
  • write(): 向文件描述符寫入數據。

    const char* data = "Hello, World!";
    ssize_t bytesWritten = write(fd, data, strlen(data));
    if (bytesWritten == -1) {
        perror("write");
    }
    
  • close(): 關閉文件描述符。

    close(fd);
    

2. 進程控制

  • fork(): 創建一個新進程。

    pid_t pid = fork();
    if (pid == -1) {
        perror("fork");
    } else if (pid == 0) {
        // 子進程
        execl("/bin/ls", "ls", NULL);
        perror("execl");
        exit(1);
    } else {
        // 父進程
        wait(NULL);
    }
    
  • exec()系列: 執行一個新的程序。

    execl("/bin/ls", "ls", NULL);
    perror("execl");
    exit(1);
    
  • wait(): 等待子進程結束。

    pid_t pid = fork();
    if (pid == -1) {
        perror("fork");
    } else if (pid == 0) {
        // 子進程
        execl("/bin/ls", "ls", NULL);
        perror("execl");
        exit(1);
    } else {
        // 父進程
        int status;
        waitpid(pid, &status, 0);
    }
    

3. 信號處理

  • signal(): 設置信號處理函數。
    #include <csignal>
    void handler(int signum) {
        std::cout << "Received signal " << signum << std::endl;
    }
    
    int main() {
        signal(SIGINT, handler);
        while (true) {
            // 主循環
        }
        return 0;
    }
    

4. 網絡編程

  • socket(): 創建一個套接字。

    #include <sys/socket.h>
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd == -1) {
        perror("socket");
    }
    
  • bind(): 綁定套接字到地址。

    struct sockaddr_in serv_addr;
    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(8080);
    
    if (bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) {
        perror("bind");
    }
    
  • listen(): 監聽連接。

    if (listen(sockfd, 5) == -1) {
        perror("listen");
    }
    
  • accept(): 接受連接。

    struct sockaddr_in cli_addr;
    socklen_t clilen = sizeof(cli_addr);
    int newsockfd = accept(sockfd, (struct sockaddr*)&cli_addr, &clilen);
    if (newsockfd == -1) {
        perror("accept");
    }
    
  • connect(): 連接到服務器。

    struct sockaddr_in serv_addr;
    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(8080);
    inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr);
    
    if (connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) {
        perror("connect");
    }
    

5. 內存管理

  • mmap(): 映射文件或設備到內存。

    void* addr = mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, offset);
    if (addr == MAP_FAILED) {
        perror("mmap");
    }
    
  • munmap(): 解除內存映射。

    if (munmap(addr, length) == -1) {
        perror("munmap");
    }
    

注意事項

  1. 錯誤處理: 系統調用通常返回-1表示錯誤,并設置errno變量。使用perror()函數可以打印錯誤信息。
  2. 資源管理: 確保在使用完文件描述符、套接字等資源后及時關閉或釋放。
  3. 安全性: 系統調用涉及內核級別的操作,務必小心處理輸入輸出,避免安全漏洞。

通過這些系統調用,C++程序可以在Linux系統上實現各種復雜的功能。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女