
Linux编程
文章平均质量分 96
日落星野
Success is not final, failure is not fatal: it is the courage to continue that counts.
展开
-
进程间通信(三)代码练习
通过编程实现对以往学习函数的使用,例如文件的重定向,创建子进程,exec族函数等同时对信号量集的理解也加深,了解IPC通信的三种方式:共享内存、消息队列、信号量原创 2024-10-25 22:07:38 · 369 阅读 · 0 评论 -
进程间通信(二)消息队列、共享内存、信号量
本文介绍了进程间通信(IPC)的几种机制,重点讨论了System V IPC中的消息队列。消息队列允许进程通过内核中的链表结构进行数据交换,具有先进先出的特性。文章详细解释了消息队列的创建、打开、发送和接收消息的操作,并提供了相应的代码示例。此外,还探讨了消息队列的属性控制方法,包括获取和设置属性以及删除消息队列。通过这些机制,进程可以高效地在内核空间交换信息,而无需直接访问对方的内存空间。原创 2024-10-24 21:26:00 · 970 阅读 · 0 评论 -
进程间通信(一)管道
进程间通信(IPC)是操作系统核心概念之一,它允许不同进程间交换数据和信息。本文首先概述了IPC的几种主要方式,包括匿名管道、命名管道、信号、消息队列、共享内存、信号量及套接字。接着,详细介绍了匿名管道和命名管道的工作原理及其在父子进程和无血缘关系的进程间通信中的应用。通过示例代码展示了如何创建和使用管道进行进程间的数据传输。此外,还讨论了管道的读写特性,包括阻塞行为、不完整管道的处理以及它们在实际编程中的应用。文章最后指出,理解和正确使用这些IPC机制对于开发高效、可靠的多进程应用程序至关重要。原创 2024-10-24 21:22:04 · 1026 阅读 · 0 评论 -
线程(五)线程的同步和互斥——线程信号量
本文介绍了线程同步和互斥的几种方法,包括互斥锁、读写锁、自旋锁、条件变量和信号量。通过具体案例展示了这些机制在实际应用中如何实现线程间的同步与互斥。文章详细讲解了信号量的初始化、销毁以及加减操作,并通过实例展示了如何使用信号量控制线程执行顺序和实现线程间互斥与同步。最后,讨论了死锁的产生原因,包括资源竞争、持有并等待以及不可剥夺性,帮助读者深入理解线程同步与互斥的复杂性和重要性。原创 2024-10-09 21:34:32 · 975 阅读 · 0 评论 -
线程(四)线程的同步——条件变量
本文主要介绍了线程同步与互斥的概念,并详细解释了条件变量在线程同步中的应用。首先,文章通过一个产品发布的例子说明了线程同步的重要性,强调了线程之间的相互依赖和先后执行约束问题。接着,深入讲解了条件变量的定义、初始化、销毁以及等待操作和通知操作的实现方法。此外,还通过具体的代码示例展示了如何使用条件变量实现线程间的同步,包括使用条件变量进行线程同步的具体步骤和注意事项。最后,通过两个实例展示了条件变量在实际编程中的应用,帮助读者更好地理解和掌握线程同步与互斥的相关技术。原创 2024-10-09 21:31:20 · 1167 阅读 · 0 评论 -
线程(三) 线程的互斥
本文介绍了线程中的互斥机制。互斥是确保同一时间只有一个线程执行特定代码段,防止多个线程同时修改共享资源。解决方式包括使用条件变量、线程信号量等。示例展示了在多线程环境下操作共享账户的风险,通过互斥锁可以有效避免数据不统一的问题。文章还详细解释了互斥锁的创建、销毁以及上锁和解锁的方法,以及读写锁的创建和使用。同时介绍了为什么要使用读写锁,读写锁的应用场景等原创 2024-09-21 18:25:51 · 1591 阅读 · 0 评论 -
线程(二) 线程清理和控制、线程的属性
本文主要介绍了线程的清理和控制函数,包括`pthread_cleanup_push`和`pthread_cleanup_pop`。这些函数允许在线程退出时执行特定的清理任务,通过注册和撤销清理处理程序来管理资源。文章还比较了进程和线程的创建、退出、资源回收和终止方式,并详细介绍了线程属性的初始化和销毁,特别是如何设置和获得分离属性以实现线程资源的自动释放。原创 2024-09-18 17:08:58 · 817 阅读 · 0 评论 -
线程(一) 线程的分类、创建、终止
本文主要介绍了线程的基本概念、创建和终止方法。线程是程序执行的最小单位,负责处理进程中的某个事务。文章详细解释了线程与进程的关系,以及如何通过`pthread_create`函数创建线程和`pthread_exit`或`pthread_cancel`函数终止线程。同时,还讨论了线程同步和互斥的重要性,以及如何在多线程环境中管理资源。最后,通过示例代码展示了线程的创建、运行和终止过程。原创 2024-09-18 17:02:17 · 1085 阅读 · 0 评论 -
进程之信号
本文详细介绍了Linux系统中的信号机制,包括信号的概念、来源、处理方式以及相关函数。信号是进程间通信的一种方式,可以用于中断进程的执行或改变其状态。文章解释了硬件中断和软件中断的区别,并指出信号是一种软件中断。信号的来源可以是硬件操作(如按下键盘)或软件操作(如系统调用)。信号的处理方式有三种:忽略信号、执行默认操作和捕获信号。文章还介绍了signal函数及其使用方法,以及如何使用kill和raise函数发送信号。以及最后的alarm和setitimer来设置定时器的函数原创 2024-09-17 09:27:16 · 800 阅读 · 0 评论 -
进程相关的系统调用
本文介绍了进程相关的系统调用,包括`wait`、`waitpid`和`exec`族函数。`wait`函数用于等待子进程退出并回收资源,防止僵尸进程的产生。`waitpid`函数可以等待指定的子进程退出并提供更多选项,如非阻塞模式和检测子进程暂停状态。`exec`族函数用于在子进程中执行其他程序,替换当前进程的代码段、数据段、堆和栈。通过这些系统调用,可以实现父子进程间的通信和资源共享,提高程序的功能性和可扩展性。原创 2024-09-17 09:21:26 · 741 阅读 · 0 评论 -
进程状态、进程创建和进程分类
这篇文章详细介绍了进程的基本概念、状态及其管理。首先,解释了程序与进程的区别,并展示了如何通过`ps`指令查看进程信息。接着,文章深入探讨了进程的生命周期,包括创建、执行、终止等过程,以及进程间通信(IPC)的机制。此外,还讨论了进程调度策略和虚拟内存的管理,强调了分时操作系统中时间片的概念。最后,文章通过示例代码演示了如何使用`fork`函数创建子进程,并分析了父子进程之间的关系和属性继承情况。原创 2024-09-16 14:42:03 · 980 阅读 · 0 评论 -
进程启动和进程终止
本文详细介绍了进程的基本概念、创建、管理和终止过程。首先,解释了程序与进程的区别,强调进程是程序的运行实例,具有独立的权限和职责。接着,介绍了如何通过`ps`命令查看系统中的进程信息,并详细讨论了进程ID及其在Linux系统中的重要性。进一步,文章深入探讨了进程表项的内容及其在虚拟内存中的分布。此外,还分析了C程序的启动过程,包括预处理、编译、汇编和链接四个步骤,以及启动例程的作用。最后,讨论了进程的终止方式,包括正常终止和异常终止,并通过示例展示了不同终止方式对资源释放的影响。原创 2024-09-16 14:38:32 · 674 阅读 · 0 评论 -
make和Makefile
本文介绍了如何使用Makefile和make工具来管理编译过程,提高软件开发效率。通过将编译指令写入Makefile,可以自动执行编译、链接等操作,避免了手动输入大量命令的繁琐。文中还介绍了Makefile的基本编写规则,包括目标、依赖项和命令列表,并展示了如何利用变量和内置变量简化Makefile的内容。最后,通过一个实际例子演示了Makefile的使用方法和注意事项。原创 2024-09-01 20:29:43 · 1522 阅读 · 0 评论 -
静态库和共享库
本文介绍了库的概念、函数库和库函数,以及静态库与共享库(动态库)的创建与使用。静态库在程序链接时将所用函数代码复制到可执行文件中,使得文件较大但运行时无需额外文件。共享库则在运行时加载所需函数,导致可执行文件更小,但依赖动态库的存在。创建静态库使用`ar`工具,而创建共享库则用`gcc -shared`。使用这些库时,需在编译命令中指定库的路径和名称。静态库删除后不影响已生成的可执行文件运行,但删除共享库会导致依赖它的可执行文件无法运行。原创 2024-09-01 20:25:34 · 1114 阅读 · 0 评论 -
Linux文件编程(进阶)
本文介绍了Linux文件编程中的文件操作基本元素,包括目录结构、索引节点和文件数据。同时详细解释了软链接和硬链接的原理、创建方式以及它们在不同情况下的表现。文章还提供了使用link、unlink、remove、rename、symlink和readlink等函数的代码示例,展示了如何在C程序中操作这些链接。原创 2024-08-26 18:23:56 · 770 阅读 · 0 评论 -
Linux文件编程(进阶)
Linux文件编程涉及内核数据结构、重定向、文件描述符操作和I/O处理方式。内核通过文件描述符表、文件表项和i节点来管理文件。重定向包括输入重定向、输出重定向和追加输出重定向,使用``, `>>`符号实现。`dup2`函数用于复制文件描述符,常用于文件重定向。`fcntl`函数允许对已打开的文件描述符进行多种操作,如复制文件描述符、获取或设置文件描述符标志等。此外,还介绍了如何使用`O_APPEND`标志位保证原子操作。原创 2024-08-26 18:21:13 · 1075 阅读 · 0 评论 -
Linux文件编程(系统API调用)
Linux文件编程涉及输入输出缓存、系统调用和文件操作。输入输出缓存类型包括全缓存、行缓存和无缓存,通过`fflush`函数可强制清空缓存。文件I/O系统调用如`open`, `read`, `write`, `lseek`等不带缓存功能,而标准C库函数如`fgets`, `fputs`, `fprintf`等提供带缓存的文件访问。文件描述符是系统调用中用于标识文件的非负整数,与标准输入、输出、错误相关联。文件指针和文件描述符可相互转换。此外,还介绍了如何实现cp操作的代码示例。原创 2024-08-26 18:15:27 · 1245 阅读 · 0 评论 -
Linux网络编程
如果accept函数成功接受一个连接请求,它会返回一个新的套接字描述符,这个新的套接字用于与客户端进行数据传输。例如常见的微信就是基于网络来进行通信的,通过网络通信来进行信息发送、语音通话、视频通过等操作,极大的提高了通信的实时性。,但是通过对其通信方式的编程都是基于在一台电脑上执行的,但是这极大地局限了通信的方式。所以当从一台主机将数据传送到网络上,然后又从网络将数据传送到另一台主机上时就会涉及到数据的转换,要不然就可能导致数据的不正确。连接传送的数据,无差错,不丢失,不重复,且按序到达;原创 2024-06-22 23:19:12 · 904 阅读 · 0 评论 -
Linux线程
线程是属于进程的,线程运行在进程空间内,同意进程产生的进程共享同一用户内存空间,当进程退出时该进程产生的线程都会被强制退出并清除。当进程创建起来的时候默认只有一个线程(主线程),此时如果遇到大并发的请求,那么一个线程的处理效率就不够,需要创建其他的线程(子线程)来处理新的请求,这样能提高程序的执行效率。的值为1,然后休眠一秒,此时可能子进程2抢占到了CPU,继续接着之前的代码执行,子进程2尝试去上锁,但此时这把锁已经被子进程1获取,所以子进程2就被阻塞,继而接着去执行子进程1的程序,直到子进程检测到。原创 2024-03-21 19:44:36 · 1039 阅读 · 0 评论 -
Linux编程之进程
什么是程序,什么是进程?简单的来说,没有跑起来的文件叫做程序(是静态概念),例如调用gcc test.c -o test 生成的这个test文件,它就是一个程序,当这个程序跑起来就是进程(动态概念)。进程是程序的一次执行,也就是说每执行一次程序,它就会生成一个新的进程。如何查看系统中有哪些进程?由于当前的程序时非常多的,所以我们要使用grep指令进行筛选,例如:查看当前进程中带有 “init” 字样的进程什么是进程标识符?每个进程都有一个唯一非负整数表示它的进程标识符(类似于之前的文件描述符),用pid原创 2024-01-22 15:11:50 · 1037 阅读 · 0 评论 -
Linux进程间通信
它是基于文件系统的共享文件,提供了一种机制,用于连接一个读进程和一个写进程,从而实现它们之间的信息传递。由以上结果可知,当当前路径下没有创建管道的时候,编译执行代码没有问题,但是如果当前文件下已经有了名字相同的管道就会报错文件已存在,所以对代码进行修改:当当前路径下有名字相同的管道不报错。需要注意的是,信号是异步的,即发送信号的进程和接收信号的进程之间没有直接的通信机制。当函数执行成功时,会返回一个key_t类型的键值,该键值是一个整数,与指定的文件的索引节点号和子序列号有关。否则,它将返回-1。原创 2024-01-22 10:16:28 · 1103 阅读 · 0 评论 -
Linux文件编程
文件描述符:在打开或者创建一个文件时,会返回一个文件描述符给用户。文件描述符是一个非负整数,相当于文件的索引。后续的read、write、lseek等操作都是基于文件描述符,所以当文件打开失败,后续的操作无法进行。原创 2023-10-22 09:05:02 · 183 阅读 · 1 评论