初步认识Linux系统编程

Linux是一种自由和开放源代码的操作系统,它以良好的稳定性、强大的安全性和广泛的应用领域而著称。Linux系统编程是指在Linux操作系统下开发应用程序的过程,其中包括与硬件交互、系统调用以及与其他程序进行通信等。

文章目录

    • 学习Linux系统编程前的准备工作
    • 编写第一个Linux系统编程程序
    • 学习系统调用
    • 学习进程管理
    • 学习文件系统
    • 学习网络编程

学习Linux系统编程前的准备工作

在开始学习Linux系统编程之前,我们需要先安装Linux操作系统和相应的开发工具。这里我们推荐Ubuntu作为学习和开发的平台,并安装GCC编译器和相应的开发库。GCC是一个优秀的编译器套件,支持多种编程语言,特别适合在Linux系统下进行开发。

编写第一个Linux系统编程程序

首先,我们将创建一个简单的程序来熟悉Linux系统编程的基本步骤。我们使用C语言来编写程序,打开终端并输入以下命令创建一个名为hello.c的文件:

#include <stdio.h>int main() {printf("Hello, World!\n");return 0;
}

这是一个非常简单的程序,它只是输出一条消息“Hello, World!”到终端。接下来,我们使用GCC编译器将其编译成可执行文件,在终端中输入以下命令:

gcc -o hello hello.c

该命令将编译hello.c文件,并生成一个名为hello的可执行文件。编译成功后,我们可以通过运行以下命令执行程序:

./hello

你将看到终端输出了我们期望的消息:“Hello, World!”。这是一个非常简单的示例,但它展示了Linux系统编程的基本流程。

学习系统调用

系统调用是Linux系统编程中非常重要的一部分,它允许程序直接与操作系统进行交互。系统调用提供了访问底层操作系统服务的接口,比如文件操作、进程管理、网络通信等。

我们以文件操作为例来介绍系统调用的使用。请参考以下代码:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>int main() {int fd = open("test.txt", O_CREAT | O_WRONLY | O_TRUNC, S_IRWXU);if (fd == -1) {perror("open");return 1;}char *content = "This is a test.";ssize_t bytes_written = write(fd, content, strlen(content));if (bytes_written == -1) {perror("write");return 1;}close(fd);return 0;
}

这段代码打开了一个名为test.txt的文件,并向其中写入了一段内容。首先,我们调用open()系统调用函数来打开一个文件,并指定了打开方式(O_CREAT | O_WRONLY | O_TRUNC)和访问权限(S_IRWXU)。之后,我们调用write()系统调用函数将内容写入文件。最后,我们调用close()系统调用函数关闭文件。

学习进程管理

Linux系统编程还涉及到进程管理,我们可以通过系统调用来创建和管理进程。以下是一个创建子进程的示例:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main() {pid_t pid = fork();if (pid == -1) {perror("fork");return 1;}else if (pid == 0) {// 子进程printf("Child process\n");}else {// 父进程printf("Parent process\n");}return 0;}

在这个示例中,我们使用了 fork()系统调用函数来创建一个新的子进程。fork()函数在父进程中返回子进程的PID,而在子进程中返回0。根据返回值的不同,我们可以区分子进程和父进程,并在不同的进程中执行不同的代码。

学习文件系统

在Linux系统编程中,文件系统是一个重要的概念。Linux提供了一种层次化的文件系统结构,你可以使用文件系统API对文件和目录进行操作。

下面是一个简单的示例,演示了如何使用stat()函数获取文件的信息:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>int main() {struct stat file_info;if (stat("file.txt", &file_info) == -1) {perror("stat");return 1;}printf("File size: %ld bytes\n", file_info.st_size);printf("File permissions: %o\n", file_info.st_mode & 0777);return 0;
}

在这个示例中,我们使用stat()函数获取文件的信息,包括文件的大小和文件的权限。stat()函数将文件信息存储在struct stat结构中,我们可以通过该结构的成员变量来访问相关信息。

学习网络编程

在Linux系统编程中,网络编程是一个重要的领域。通过网络编程,你可以构建各种类型的网络应用程序,如客户端和服务器。

下面是一个简单的示例,展示如何使用套接字(socket)进行网络通信:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>int main() {// 创建套接字int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1) {perror("socket");return 1;}// 设置套接字参数struct sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr.sin_port = htons(8080);server_addr.sin_addr.s_addr = INADDR_ANY;// 绑定套接字if (bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {perror("bind");close(sockfd);return 1;}// 监听连接if (listen(sockfd, 10) == -1) {perror("listen");close(sockfd);return 1;}printf("Server listening on port 8080...\n");// 接受连接struct sockaddr_in client_addr;socklen_t client_len = sizeof(client_addr);int clientfd = accept(sockfd, (struct sockaddr*)&client_addr, &client_len);if (clientfd == -1) {perror("accept");close(sockfd);return 1;}printf("Client connected!\n");// 关闭套接字close(clientfd);close(sockfd);return 0;
}

在这个示例中,我们首先创建了一个套接字,然后设置套接字的参数。我们绑定了套接字,并监听连接。当有客户端连接时,我们使用accept()函数接受连接。最后,我们关闭了套接字。这个示例展示了一个简单的服务器的搭建过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/7591.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

04. Idea集成Docker

目录 1、前言 2、开启docker远程 2.1、配置远程访问模式 2.2、重启docker服务 2.3、验证 3、Idea配置Docker 3.1、配置证书登录 4、创建Dockerfile 4.1、编写Dockerfile 4.2、配置启动项 4.3、访问接口 1、前言 上一节中&#xff0c;我们介绍了Dockerfile的方式构建…

Mac电脑必备:3款优质系统软件推荐

对于Mac电脑使用者来说&#xff0c;良好的系统软件是确保计算机高效运行和提升使用者体验的关键。无论是日常办公、娱乐还是创意设计&#xff0c;一系列优质的系统软件都能为使用者带来更顺畅、更便捷的操作体验。在本文中&#xff0c;我们将推荐3款在Mac电脑上必备的优质系统软…

数据结构之优先级队列(堆)

文章目录 1.优先级队列概念 &#x1f4ae;2.优先级队列的模拟实现&#x1f4ae;3.常用接口PrinrityQueue介绍&#x1f4ae;4.堆的应用&#x1f4ae; 1.优先级队列概念 &#x1f4ae; 优先级队列 &#xff1a;是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优…

qt采用C++/CLI 方式调用C#dll的封装方法

在qt中调用Cdll一般都可以直接使用&#xff0c;但是在调用C#版dll时&#xff0c;就有些麻烦了。本文采用C/cli封装C#的dll的方式。实现了qt调用C#dll的方法。 .h文件 #pragma once #include <string> //stl库 #include <vector> // stl中vector库//dll生成文件定…

CAD中让时间日期自动填写的方法

图纸的图签中&#xff0c;通常会有一栏是出图日期。有的单位&#xff0c;也会叫做版本号。即哪天出的图。一般情况下&#xff0c;出图日期就是打图当天。 在这样的前期下&#xff0c;图纸由于存在频繁修改&#xff0c;所以出图日期也会存在变化。还有一种情况&#xff0c;就是出…

linux 用户鉴权文件学习

一、 /etc/sudoers /etc/sudoers用于管理 Linux 系统上特权操作的访问控制列表&#xff08;ACL&#xff09;。该文件指定了哪些用户、组或主机可以执行特权命令&#xff0c;以及他们可以执行哪些命令。 # sudoers file. # # This file MUST be edited with the visudo comman…

Docker Compose 实现单机容器集群编排管理

目录 Docker ComposeDocker Compose 三大概念1. Docker Compose 环境安装2. YAML 文件格式及编写注意事项3. Docker Compose配置restart 设置重启策略&#xff0c;no&#xff0c;always&#xff0c;no-failure&#xff0c;unless-stopped 4. Docker Compose 常用命令选项5. Doc…

基础算法-数组模拟栈

栈&#xff1a;先进后出 队列&#xff1a;先进先出 栈 例题&#xff1a; 实现一个栈&#xff0c;栈初始为空&#xff0c;支持四种操作&#xff1a; push x – 向栈顶插入一个数 x&#xff1b;pop – 从栈顶弹出一个数&#xff1b;empty – 判断栈是否为空&#xff1b;query …

mysql实现in且模糊匹配、实现 in( like xxx ) 效果

问题 删除某表涉及到指定任务id的数据&#xff0c;没有直接关联字段&#xff0c;只有在某表的body字段中存储有含任务id的json串&#xff0c;所以需要批量模糊匹配 用到的函数 REGEXP 可以实现模糊匹配多个值 select * from xxx where body like %"taskId":1% or…

CPU渲染or GPU渲染,你选对了吗?看完这六点就懂了!

在进行动画或效果图渲染时&#xff0c;选择适合的渲染方式对于项目的速度和质量至关重要。CPU渲染和GPU渲染作为两种主要的渲染方式&#xff0c;哪一种更适合你现在的情况&#xff1f;接下来我将从以下六个方面带大家深入了解&#xff0c;看完就知道怎么选了。 1.渲染原理 CPU…

OS1_进程与线程的管理

序言 1.OS以进程、线程的方式在CPU中执行静态保存在外存(内存)中的程序&#xff0c;进程的构成与状态转化&#xff0c;特别是进程的切换&#xff1b; 2.当有多个进程处于就绪态&#xff0c;有哪些常见的挑选以执行方式&#xff1b; 3.并发执行(乱序发射)的进程&#xff0c;共享…

Pytorch深度学习------torchvision中dataset数据集的使用(CIFAR10)

文章目录 一、什么是TorchVision二、以torchvision.datasets子模块下的CIFAR10数据集为例1、CIFAR10数据集参数2、代码中使用 一、什么是TorchVision torchvision是pytorch的一个图形库&#xff0c;用来处理图像&#xff0c;主要用来构建计算机视觉模型。 从下面的官网截图可以…

手写设计模式

单例模式 饿汉式 public class SingleTon {private static SingleTon instance new SingleTon();private SingleTon(){};public static SingleTon getInstance(){return instance;} }要点&#xff1a; 静态 private instance私有的构造器方法返回 instance 懒汉式 public…

TCP/UDP的首部

TCP/UDP首部信息 TCP首部第一个4字节第二个4字节与第三个4字节第四个4字节第五个4字节选项最大报文段长度&#xff08;MSS&#xff09;选项窗口扩大选项时间戳选项 什么时候发送RST包UDP首部 TCP首部 TCP 首部长度为20字节&#xff0c;加上选项部分最大可达60字节。 第一个4…

微服务远程调用openFeign简单回顾

目录 一. OpenFeign简介 二. OpenFeign原理 演示使用 provider模块 消费者模块 配置全局feign日志 示例源代码: 一. OpenFeign简介 OpenFeign是SpringCloud服务调用中间件&#xff0c;可以帮助代理服务API接口。并且可以解析SpringMVC的RequestMapping注解下的接口&#x…

接口漏洞-DVWS(XXE+鉴权)+阿里云KEY

dvws靶场 靶场&#xff1a;https://github.com/snoopysecurity/dvws-node 开启靶场&#xff0c;注册一个普通用户&#xff0c;登录成功 来到首页点击admin area 发现进入几秒钟之后又跳转回到首页&#xff0c;只有管理员admin用户才能进入。 点击admin area抓包&#xff0c;发现…

C# List 详解四

目录 18.FindLast(Predicate) 19.FindLastIndex(Int32, Int32, Predicate) 20.FindLastIndex(Int32, Predicate) 21.FindLastIndex(Predicate) 22.ForEach(Action) 23.GetEnumerator() 24.GetHashCode() 25.GetRange(Int32, Int32) C#…

实验二十四、滞回比较器电压传输特性的测量

一、题目 滞回比较器电压传输特性的测量。 二、仿真电路 电路如图1所示。 为便于观察电压传输特性的变化&#xff0c;输入信号采用信号发生器产生的幅值为 10 V 10\,\textrm V 10V、频率为 20 Hz 20\,\textrm{Hz} 20Hz 的三角波电压。采用虚拟的运算放大电路&#xff0c;其…

js中的数据结构之栈

js中的数据结构之栈 一、定义 栈是一种限定仅在表尾进行插入和删除操作的线性表&#xff0c;遵循后入先出的原则。 二、描述 栈是和列表类似的一种数据结构&#xff0c;也可以说栈就是一种特殊的列表。 栈里面的元素只能通过列表的一端访问&#xff0c;这一端称为栈顶。相…

树莓派 使用 docker安装showdoc

最近在使用showdoc时感觉挺方便的&#xff0c;但是在树莓派上拉取showdoc对应的镜像时特别慢&#xff0c;熬了一天半发现镜像倒在了最后一步&#xff0c;重试了好几次都没有拉去下来。后来仔细阅读了官网操作文档再加一点小运气今天成功给安装成功了。 showdoc的安装环境&…