Linux系统编程
文章平均质量分 79
Linux系统编程相关的知识
Wanliang Li
Stay Hungry, Stay Foolish
展开
-
Linux系统编程——网络编程(二)Socket编程步骤 和 Linux提供的API解析
一、Socket编程步骤TCP服务器编程步骤:1、创建Socket套接字,用Socket ()函数2、设置Socket属性,用setsockopt()也可以不用3、为套接字添加信息(IP地址和端口号)用bind()函数4、开启监听,用listen()函数5、监听到有客户端接入,接受一个连接,用accept()函数6、交换数据,用函数send()和recv(),或者用read(),write()7、关闭套接字,断开连接TCP客户端编程步骤:1、创建一个Socket,用Socket函数2、原创 2021-06-14 20:54:58 · 285 阅读 · 2 评论 -
Linux系统编程——网络编程(一)网络编程概述、Socket(套接字),TCP/UDP以及字节序
1、 网络编程概述进程间通信学习了:管道、消息队列、共享内存、信号、信号量这5种通信方式,但是都是依靠Liunx内核进行的。这也造成了他们的一个缺点就是只能在单机运行。如果要实现多机通信就需要引入网络编程。那么如何准确地定位网络上一台或多台主机以及定位主机呢?即通过通信双方的地址。地址由IP地址和端口号组成。IP地址:负责定位主机。端口号:负责定位主机上的特定应用。端口号的作用:一台拥有IP地址的主机可以提供许多服务,比如Web服务、 FTP服务、SMTP服务等。这些服务完全可以通过1个IP地原创 2021-06-14 16:00:32 · 216 阅读 · 0 评论 -
Linux系统编程——线程(四)条件相关API
条件变量是线程另一可用的同步机制。条件变量给多个线程提供了一个会合的场所。条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生。条件本身是由互斥量保护的。线程在改变条件状态前必须首先锁住互斥量,其他线程在获得互斥量之前不会察觉到这种改变,因为必须锁定互斥量以后才能计算条件。条件变量使用之前必须首先初始化pthread_cond_t数据类型代表的条件变量可以用两种方式进行初始化,可以把常量PTHREAD_COND_INITIALIZER赋给静态分配的条件变量静态初始化:pthread原创 2021-06-14 00:00:14 · 122 阅读 · 0 评论 -
Linux系统编程——线程(三)互斥量相关API 和线程死锁
互斥量(mutex) 从本质上就是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。对互斥量进行加锁后,其他线程试图再次对互斥量加锁,则将会被阻塞,直到当前线程释放该互斥锁。如果释放互斥锁时有多个线程阻塞,所有在该互斥锁上的阻塞线程都会变成可运行状态,第一个变为可运行状态的线程可以对互斥量加锁,其他线程将会看到互斥锁依然被锁住,只能回去等待它重新变为可用。在这种方式下,每次只有一个线程可以向前运行。互斥变量用pthread_mutex_t数据类型表示。在使用互斥变量前必须对它进行初原创 2021-06-13 18:58:12 · 369 阅读 · 0 评论 -
Linux系统编程——线程(二)线程自身相关API 和 线程共享内存的验证
头文件#include<pthread.h>线程操作包括3 种线程的创建,退出,等待。1、创建函数原型int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);// 返回:若成功返回0,否则返回错误编号当pthread_create成功返回时tidp:指向的内存单元被设置为新创原创 2021-06-13 04:05:06 · 148 阅读 · 0 评论 -
Linux系统编程——线程(一)进程和线程的区别、线程的优点、以及线程开发的API
进程和线程进程是程序执行时的一个实例,是担当分配系统资源(CPU时间、内存等)的基本单位。在面向线程设计的系统中,进程本身不是基本运行单位,而是线程的容器。程序本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例。线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。线程包含了表示进程内执行环境必须的信息,其中包括进程中表示线程的线程ID、一原创 2021-06-13 01:58:08 · 225 阅读 · 0 评论 -
Linux系统编程——进程间的通信(六)信号量
信号量信号量(Semaphore),是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,需要创建一个信号量。它是一个计数器。信号量用于实现进程或者线程间的互斥与同步,而不是用于存储进程间通信数据。特点(1)信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。(2)信号量基于操作系统的P原创 2021-06-12 20:31:37 · 353 阅读 · 0 评论 -
Linux系统编程——进程间的通信(五)信号
对于 Linux来说,实际信号是软中断,许多重要的程序都需要处理信号。信号为 Linux 提供了一种处理异步事件的方法。比如,终端用户输入了 ctrl+c 来中断程序,会通过信号机制停止一个程序 。信号概述...原创 2021-06-12 02:34:36 · 743 阅读 · 0 评论 -
Linux系统编程——进程间的通信(四)共享内存
什么是共享内存和共享内存的特点?所谓共享内存就是使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。原理进程A将信息放入共享内存中进程B从共享内存中读取编程步骤1、创建或者打开共享内存2、进程A连接(映射)共享内存,写入数据3、进程A断开4、进程B连接(映射)共享内存,读取数据5、进程B断开6、释放共享内存常用API1 #include <sys/shm.h>原创 2021-05-12 23:10:11 · 279 阅读 · 2 评论 -
Linux系统编程——进程间的通信(三)消息队列原理以及用法
消息队列是消息的链接表,存放在内核中,一个消息队列由一个标识符(队列ID)来标识。特点:1、消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级2、消息队列独立于发送与接收进程,进程终止时,消息队列中的内容不会被删除3、消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按照消息的类型读取原理消息队列常用API头文件#include <sys/types.h>#include <sys/ipc.h>#include <sys/原创 2021-05-11 00:07:21 · 7466 阅读 · 0 评论 -
Linux系统编程——进程间的通信(二)无名管道和命名管道
一、无名管道管道通常是指无名管道,(因为没有文件名,所以叫无名管道)是 UNIX 系统IPC最古老的形式。特点:1、它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。2、它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。3、它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。4、管道中的数据被读走了,管道中就没有数据了。原理当建立一个管道时,由参数fd返原创 2021-05-09 01:18:10 · 838 阅读 · 0 评论 -
Linux系统编程——进程间的通信(一)进程通信的概述
一、最基本的进程通信1、创建子进程,当子进程退出时,父进程收集子进程的信息2、使用exec族函数不管是用fork函数创建子进程还是用exec族函数,这些都是不全的进程通信二、真正意义上的进程通信——IPC两个进程间进行通信IPC的方式通常有管道(无名管道和命名管道),消息队列,信号量,共享储存,Socket、Streams等,其中Socket、Streams支持两台PC机上的两个进程。单机通信:如果是在一台机器上,则为单机通信 ,如半双工管道,全双工管道,消息队列,信号量,共享内存多机通原创 2021-05-08 21:29:10 · 212 阅读 · 0 评论 -
Linux系统编程——进程(六)system函数和popen函数
一、system函数头文件#include <stdlib.h>函数原型int system(const char *command);函数说明system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。返回值如果system()在调用/bin/sh时失败则返回1原创 2021-05-08 13:19:06 · 305 阅读 · 0 评论 -
Linux系统编程——进程(五)exec族函数,以及exec族函数和fork函数配合使用
exec族函数fork函数创建一个子进程的目的?1、一个父进程希望复制自己,使父,子进程同时执行不同的代码段,这在网络服务进程中是常见的——父进程等待客户端的服务请求。当这种请求到达时,父进程调用fork,使子进程处理此请求。父进程则继续等待下一个服务器请求到达。2、一个进程要执行一个不同的程序,这对shell是常见的情况,在这种情况下,子进程从fork返回后立即调用exec。exec族函数作用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时原创 2021-05-08 01:59:15 · 1011 阅读 · 0 评论 -
Linux系统编程——进程(四)进程的退出,子进程退出的信息收集,以及僵尸进程和孤儿进程
1、进程退出退出方式有两种:正常退出,异常退出正常退出有5种:1、Main函数调用return2、进程调用exit(),标准C库3、进程调用_exit()或者_Exit(),属于系统调用和线程有关的4、进程最后一个线程返回5、最后一个线程调用pthread_exit异常退出有三种:1、调用abort2、当进程收到某些信号时,如Ctrl + C3、最后一个线程对取消(cancellation),请求作出响应不管进程如何终止,最后都会执行内核中的同一段代码。这段代码为相应进程关闭所有打原创 2021-05-06 21:14:27 · 652 阅读 · 0 评论 -
Linux系统编程——进程(三)fork函数和vfork函数的区别
1、vfork函数直接使用父进程的存储空间,不拷贝2、vfork保证子进程先运行,当子进程调用exit退出后,父进程才执行用fork函数创建进程#include <sys/types.h>#include <unistd.h>#include <stdio.h>#include <stdlib.h>int main(){ int data = 3; pid_t pid; pid = fork(); if(pid原创 2021-05-06 12:38:02 · 272 阅读 · 0 评论 -
Linux系统编程——进程(二)创建进程函数(fork) 父进程给子进程拷贝了什么内容 以及 fork为什么要创建子进程
一、fork函数头文件#include <unistd.h>函数原型pid_t fork(void);如#include <sys/types.h>#include <unistd.h>#include <stdio.h>int main(){ pid_t pid; pid = getpid(); //等于父进程pid值 fork(); //创建进程 printf("my pid is %d %原创 2021-05-06 01:33:00 · 847 阅读 · 0 评论 -
Linux系统编程——进程(一)关于进程的一些问题
一、什么是程序,什么是进程,有什么区别?程序:程序是静态的概念,是存放在磁盘中的可执行文件,如gcc data.c -o Pro,磁盘中生成一个Pro文件,叫做程序进程:进程是程序的一次运行活动,也就是程序运行起来了,在系统中又多了一个进程二、如何查看系统中有哪些进程?1: PS指令ps -aux :显示全部进程grep(文件查找) :显示部分进程使用方法ps -aux | grep init //显示关于init的进程2、使用top指令查看,类似于Windows的任务管理器,(可以原创 2021-05-05 19:25:29 · 209 阅读 · 0 评论 -
Linux系统编程——文件编程(八)用C语言标准库函数操作文件
1、fopen和fclosefopen是C的标准库函数,用来打开文件open和fopen1、open是Unix系统调用函数(包括Linux),返回的是文件描述符(File Descriptor),它是文件在文件描述符表里的索引fopen是ANSIC标准中的C语言库函数,在不同的系统中应该调用不同的内核API,返回的是一个指向文件结构的指针2、移植性“fopen”是C标准函数,因此具有很好的移植性,而“open”是Unix,Linux系统调用,移植性有限,3、范围open返回的是文件描述符,而原创 2021-05-05 11:47:09 · 443 阅读 · 0 评论 -
Linux系统编程——文件编程(七)向文件里面写入整数 结构体以及结构体数组
read和write函数原型为ssize_t read(int fd, void *buf, size_t count);ssize_t write(int fd, const void *buf, size_t count);一般对buf的操作都是写入或者读出字符串,由函数原型可以看出buf是一个无类型的指针,指针又是存放地址的,所以buf可以是一个变量的的地址1、向文件写入整数#include <sys/types.h>#include <sys/stat.h>#原创 2021-05-04 23:47:31 · 628 阅读 · 0 评论 -
Linux系统编程——文件编程(六)修改配置文件
修改配置文件主要运用了对文件的打开和读写的API,同时还用到了一个字符串查找函数(strstr)strstr函数头文件#include <string.h>函数原型char *strstr(const char *haystack, const char *needle);haystack:表示被查找的目标范围needle:表示要查找的对象返回值当在haystack中查找到字符串needle时,函数返回needle在haystack中第一次出现的首地址对于strlen函数原创 2021-05-04 18:15:08 · 214 阅读 · 0 评论 -
Linux系统编程——文件编程(五)自己实现CP指令
cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。main的参数int main(void){/*代码*/}//整数类型主函数(无类型)int main(int argc,char **argv)//整数类型主函数(整数类型 统计参数个数,字符类型*数组指针至字符[])其中char **argv可以写成char argv[],两者等价argc:传入参数的个数argv:输入参数字符串,argv[0]为原创 2021-05-04 13:23:01 · 365 阅读 · 0 评论 -
Linux系统编程——文件编程(一)文件的创建 打开 关闭
1、创建(creat)创建文件可以用creat函数,也可以用和open函数进行创建。首先来看一下 creat 函数creat函数的头文件为#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>creat函数原型为 int creat(const char *pathname, mode_t mode)pathname:指向文件路径的指针,要创建的文件名mode:创建的文件模式,系原创 2021-05-03 20:36:48 · 547 阅读 · 0 评论 -
Linux系统编程——文件编程(二)文件描述符 文件编程的步骤 静态文件和动态文件
文件描述符:1、对内核而言,是通过文件描述符(file descriptor)来访问文件的。文件描述符是非负整数。打开现存文件或新建文件时,内核向进程返回一个文件描述符。当读写文件时,用open和creat函数返回的文件描述符标识该文件,将其作为参数传递给read和write函数。一般UNIX shell使用文件描述符 0 与进程的标准输入相结合,文件描述符1与标准输出相结合,文件描述符2与标准错误输出相结合,用STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO 这几个宏代原创 2021-05-03 20:34:55 · 189 阅读 · 0 评论 -
Linux系统编程——文件编程(三)文件的读出和写入
1、写入(write)头文件#include <unistd.h>函数原型ssize_t write(int fd, const void *buf, size_t count);参数:int fd :文件描述符const void *buf :字节缓冲区,buf为要写入的字符串,(buf为void的指针)size_t count:文件描述符写入字符串的大小write:在缓冲区buf中取count个字节写入到文件描述符fd指向的文件里面返回值写入成功:返回一个整型数,原创 2021-05-03 20:32:04 · 947 阅读 · 0 评论 -
Linux系统编程——文件编程(四)光标移动(lseek)
lseek是一个用于改变读写一个文件时读写指针位置的一个系统函数每个打开的文件都有一个与其相关联的“当前文件偏移量”,它通常是一个非负整数,用以度量从文件开始处计算的字节数。通常,读、写操作都从当前文件偏移量处开始,并使偏移量增加所读写的字节数。头文件 #include <sys/types.h> #include <unistd.h>函数原型 off_t lseek(int fd, off_t offset, int whence)原创 2021-05-03 20:27:56 · 894 阅读 · 0 评论