Linux应用编程基本概念

Linux应用编程基本概念

1. 系统调用

  • 系统调用是用户空间程序和内核之间进行通信的方式,
  • 提供了一组接口,允许应用程序请求内核执行特权操作
  • 系统调用的例子包括 fork read write
#include <unistd.h>

int main() {
    char buffer[256];
    read(STDIN_FILENO, buffer, sizeof(buffer));
    write(STDOUT_FILENO, buffer, sizeof(buffer));
    return 0;
}

2 进程

  • 每个进程独立的内存空间,文件描述符和执行上下文
  • fork系统调用用于创建新进程
  • exec系列系统调用用于进程中执行新程序
#include <unistd.h>
#include <sys/wait.h>

int main() {
    pid_t child_pid = fork();
    if (child_pid == 0) {
        // 子进程执行的代码
        execl("/bin/ls", "ls", NULL);
    } else {
        // 等待子进程结束
        waitpid(child_pid, NULL, 0);
    }
    return 0;
}

3 文件描述符

文件描述符是一个整数,用于标识一个打开的文件、套接字或其他I/O资源。标准输入、标准输出和标准错误的文件描述符分别是0、1和2。文件描述符的操作包括读、写、关闭等。

#include <unistd.h>
#include <fcntl.h>

int main() {
    int fd = open("example.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
    write(fd, "Hello, Linux!", 13);
    close(fd);
    return 0;
}

4 线程

Linux支持多线程编程。线程是一个轻量级的执行单元,可以与同一进程的其他线程共享内存空间。线程可以通过pthread库创建和管理。

#include <pthread.h>
#include <iostream>

void* threadFunction(void* arg) {
    std::cout << "Hello from thread!" << std::endl;
    return NULL;
}

int main() {
    pthread_t thread;
    pthread_create(&thread, NULL, threadFunction, NULL);
    pthread_join(thread, NULL);
    return 0;
}

5 进程间通信IPC

进程间通信是指不同进程之间进行数据交换的机制。Linux提供多种IPC机制,包括管道、消息队列、共享内存和信号等。这些机制允许进程之间进行数据共享和通信。
可以参考linux ipc

6 信号

信号是一种在软件层次上处理异步事件的机制。它允许进程在运行时接收通知,例如用户按下Ctrl+C终止进程。signal函数和kill命令用于处理和发送信号。

#include <csignal>
#include <iostream>

void signalHandler(int signum) {
    std::cout << "Received signal: " << signum << std::endl;
}

int main() {
    signal(SIGINT, signalHandler);  // 注册信号处理函数
    while (1) {
        // 程序执行主循环
    }
    return 0;
}

7 动态链接库

Linux支持动态链接库(共享库)的概念,允许程序在运行时动态加载和卸载共享库。这有助于减小可执行文件的大小,共享代码,提高代码的可重用性

#include <dlfcn.h>
#include <iostream>

int main() {
    void* handle = dlopen("libexample.so", RTLD_NOW);
    if (handle) {
        typedef void (*ExampleFunction)();
        ExampleFunction function = (ExampleFunction)dlsym(handle, "exampleFunction");
        if (function) {
            function();
        }
        dlclose(handle);
    }
    return 0;
}

8 文件系统操作

Linux应用编程涉及对文件系统的各种操作,例如创建、读取、写入、删除文件,以及目录操作。系统调用和标准C库提供了相关的函数,例如openreadwriteunlink等。

这些概念构成了Linux应用程序开发的基础,开发者可以通过这些机制实现复杂的应用程序和系统工具。掌握这些概念对于在Linux环境下进行应用编程至关重要。

9 socket编程

Socket 编程是 Linux 应用程序中常用的一种网络编程方式。通过使用套接字(Socket),可以实现进程间的通信和网络通信。常见的 Socket 编程包括创建套接字、绑定地址、监听连接、接受连接、发送和接收数据等操作

#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <iostream>

int main() {
    // 创建套接字
    int serverSocket = socket(AF_INET, SOCK_STREAM, 0);

    // 绑定地址
    sockaddr_in serverAddress;
    serverAddress.sin_family = AF_INET;
    serverAddress.sin_port = htons(8080);
    serverAddress.sin_addr.s_addr = INADDR_ANY;
    bind(serverSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress));

    // 监听连接
    listen(serverSocket, 5);

    // 接受连接
    int clientSocket = accept(serverSocket, NULL, NULL);

    // 发送和接收数据
    char buffer[256];
    read(clientSocket, buffer, sizeof(buffer));
    std::cout << "Received: " << buffer << std::endl;
    write(clientSocket, "Hello from server!", 18);

    // 关闭套接字
    close(clientSocket);
    close(serverSocket);

    return 0;
}

10 多路复用

多路复用是一种提高 I/O 操作效率的机制,它允许一个进程同时监视多个文件描述符。在 Linux 中,selectepoll 是常用的多路复用机制。它们可以用于处理多个套接字的并发事件,提高网络应用程序的性能。

// 使用 select 示例
#include <sys/select.h>
#include <iostream>

int main() {
    fd_set readfds;
    FD_ZERO(&readfds);
    FD_SET(STDIN_FILENO, &readfds);

    struct timeval timeout;
    timeout.tv_sec = 5;
    timeout.tv_usec = 0;

    int result = select(STDIN_FILENO + 1, &readfds, NULL, NULL, &timeout);

    if (result > 0 && FD_ISSET(STDIN_FILENO, &readfds)) {
        std::cout << "Data is available to read from stdin." << std::endl;
    } else if (result == 0) {
        std::cout << "Timeout occurred." << std::endl;
    } else {
        std::cerr << "Error in select." << std::endl;
    }

    return 0;
}

11 内存映射

内存映射是将文件的一部分直接映射到进程的地址空间,使得文件可以像内存一样被访问。mmap 是 Linux 提供的用于内存映射的系统调用。

mmap操作提供了一种机制,让用户程序直接访问设备内存,这种机制,相比较在用户空间和内核空间互相拷贝数据,效率更高。在要求高性能的应用中比较常用。mmap映射内存必须是页面大小的整数倍,面向流的设备不能进行mmap,mmap的实现和硬件有关。

#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <iostream>

int main() {
    int fileDescriptor = open("example.txt", O_RDWR);
    off_t fileSize = lseek(fileDescriptor, 0, SEEK_END);

    void* mappedMemory = mmap(NULL, fileSize, PROT_READ | PROT_WRITE, MAP_SHARED, fileDescriptor, 0);
    close(fileDescriptor);

    // 对映射的内存进行读写操作
    char* data = static_cast<char*>(mappedMemory);
    data[0] = 'H';
    data[1] = 'i';

    // 解除内存映射
    munmap(mappedMemory, fileSize);

    return 0;
}

12 定时器

Linux 提供了多种定时器机制,允许应用程序执行定时任务。setitimer 是其中之一,它允许设置定时器来在指定的时间间隔内定期触发信号。

#include <sys/time.h>
#include <csignal>
#include <iostream>

void timerHandler(int signum) {
    std::cout << "Timer expired! Signal number: " << signum << std::endl;
}

int main() {
    struct itimerval timer;
    timer.it_value.tv_sec = 2;
    timer.it_value.tv_usec = 0;
    timer.it_interval.tv_sec = 1;
    timer.it_interval.tv_usec = 0;

    signal(SIGALRM, timerHandler);

    setitimer(ITIMER_REAL, &timer, NULL);

    while (1) {
        // 主循环
    }

    return 0;
}
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值