Linux系统调用编程
- 一.进程和线程的概念
- 1.1 进程
- 1.2 线程
- 二.用 ps -a 命令查看系统中各进程的编号pid
- 2.1 打开XTerminal
- 2.2 登录阿里云服务器Ubuntu系统的账号
- 2.3 用 ps -a 命令查看系统中各进程的编号pid
- 2.4 用kill 命令终止一个进程pid
- 三.在home目录下,创建一个作业子目录,然后学习使用vi 编辑一个c代码,gcc编译,实现一个系统调用函数的例子
- 3.1 创建子目录
- 3.2 用vi 编辑一个c代码
- 3.3 使用gcc编译 C 代码
- 3.4 运行编译后的程序
一.进程和线程的概念
1.1 进程
进程是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位。可以将进程理解为一个正在运行的程序实例。比如,当你打开浏览器时,操作系统就会创建一个浏览器进程。进程具有以下特点:
动态性:进程是程序的执行过程,它有着自己的生命周期,包括创建、运行、暂停、终止等状态。例如,启动一个游戏时创建进程,关闭游戏时进程终止。
独立性:每个进程都有自己独立的内存空间、系统资源(如文件描述符)和执行上下文。这意味着一个进程的崩溃通常不会影响其他进程。例如,你在电脑上同时打开浏览器、音乐播放器和文本编辑器,它们各自作为独立的进程运行,一个进程出现问题不会导致其他进程关闭。
资源分配:操作系统会为每个进程分配必要的资源,如内存、CPU 时间片等。进程之间的资源是相互隔离的,通过进程间通信(IPC)机制,如管道、消息队列、共享内存等,实现进程之间的信息交换和同步。
1.2 线程
线程是进程中的一个执行单元,是 CPU 调度和分派的基本单位。一个进程可以包含多个线程,这些线程共享进程的资源,如内存空间、文件描述符等。例如,浏览器进程中可能包含渲染线程、网络请求线程、脚本执行线程等。线程具有以下特点:
轻量级:线程的创建和销毁开销相对较小,因为它们共享进程的资源,不需要像进程那样分配大量的系统资源。
共享资源:同一进程内的多个线程共享进程的内存空间和系统资源,这使得线程之间的通信和数据共享更加方便。但同时也带来了同步和互斥的问题,需要使用锁、信号量等机制来保证线程安全。
并发执行:多个线程可以在同一个进程内并发执行,提高了程序的执行效率。例如,在一个多媒体播放器进程中,一个线程负责播放音频,另一个线程负责播放视频,这样可以实现音频和视频的同步播放。
进程和线程的关系
一个进程可以包含多个线程,这些线程在进程的地址空间内并发执行。
进程是资源分配的基本单位,而线程是 CPU 调度的基本单位。
线程的创建和销毁比进程更加高效,因为线程不需要重新分配系统资源。
进程之间的通信相对复杂,而线程之间的通信由于共享进程的资源而更加简单
二.用 ps -a 命令查看系统中各进程的编号pid
2.1 打开XTerminal
2.2 登录阿里云服务器Ubuntu系统的账号
2.3 用 ps -a 命令查看系统中各进程的编号pid
此命令会显示当前系统中所有终端下运行的进程信息。输出结果里会有PID列,这一列对应的数值就是每个进程的编号。
2.4 用kill 命令终止一个进程pid
当你确定要终止的进程编号后,在 XTerminal 输入kill <PID>
,把<PID>
替换成你要终止的进程的实际编号。
三.在home目录下,创建一个作业子目录,然后学习使用vi 编辑一个c代码,gcc编译,实现一个系统调用函数的例子
3.1 创建子目录
先使用pwd
命令查看当前所在的目录。
使用mkdir
命令来创建作业子目录。创建一个名为assignments的作业子目录。使用ls
命令查看home目录下的文件和文件夹,以此确认作业子目录是否创建成功。
3.2 用vi 编辑一个c代码
输入vi syscall_example.c
开启vi编辑器来创建一个新的 C 文件
进入vi编辑器后,按i键进入插入模式,接着输入下面的 C 代码:
#include <stdio.h>
#include <unistd.h>
#include <string.h>int main() {// 使用系统调用函数write向标准输出写入数据const char *message = "Hello, this is a system call example!\n";ssize_t bytes_written = write(STDOUT_FILENO, message, strlen(message));if (bytes_written == -1) {perror("write");return 1;}return 0;
}
输入:wq
并回车,保存文件并退出vi编辑器
3.3 使用gcc编译 C 代码
输入以下命令,使用gcc编译刚才创建的 C 文件:
gcc -o syscall_example syscall_example.c
这个命令会把syscall_example.c
文件编译成可执行文件syscall_example
。
3.4 运行编译后的程序
输入以下命令来运行编译好的可执行文件:
./syscall_example