一口Linux

文章数:1382 被阅读:1966155

账号入驻

Linux应用编程基本概念

最新更新时间:2024-02-20
    阅读数:

点击左上方蓝色“一口Linux”,选择“设为星标


  • 温馨提示

自从公众号改版成信息流之后, 推送的文章有很多读者收不到, 所以希望还 没星标 的小伙伴,动动小手给个 星标 ,这样就可以 第一时间获取 最新干货文章了

START

Linux应用编程涉及到在Linux环境下开发和运行应用程序的一系列概念。以下是一些涵盖Linux应用编程的基本概念:

1. 系统调用

系统调用是用户空间程序与内核之间进行通信的方式。它提供了一组接口,允许应用程序请求内核执行特权操作。在Linux中,系统调用的例子包括 fork (创建新进程)、 read (读取文件)、 write (写入文件)等。开发者通常通过系统调用接口来访问操作系统提供的功能。

#include 

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

2. 进程

在Linux中,进程是正在运行的程序的实例。每个进程都有独立的内存空间、文件描述符和执行上下文。 fork 系统调用用于创建新进程。 exec 系列系统调用用于在进程中执行新程序。

#include 
#include 

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

3. 文件描述符

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

#include 
#include 

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 
#include 

voidthreadFunction(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机制,包括管道、消息队列、共享内存和信号等。这些机制允许进程之间进行数据共享和通信。

6. 信号

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

#include 
#include 

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

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

7. 动态链接库

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

#include 
#include 

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库提供了相关的函数,例如 open read write unlink 等。

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

9. Socket 编程

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

#include 
#include 
#include 
#include 

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, NULLNULL);

    // 发送和接收数据
    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. 多路复用(select 和 epoll)

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

// 使用 select 示例
#include 
#include 

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, NULLNULL, &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)

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

#include 
#include 
#include 
#include 

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 
#include 
#include 

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;
}

这些概念覆盖了 Linux 应用编程的多个方面,包括文件 I/O、网络编程、进程控制、多路复用、内存映射、定时器等。深入了解这些概念将帮助开发者编写高效且功能强大的 Linux 应用程序。

end



一口Linux


关注,回复【 1024 】海量Linux资料赠送

精彩文章合集

文章推荐

【专辑】 ARM
【专辑】 粉丝问答
【专辑】 所有原创
专辑 linux 入门
专辑 计算机网络
专辑 Linux驱动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: TI培训

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved