linux系统编程
文章平均质量分 82
形形色色的人
这个作者很懒,什么都没留下…
展开
-
Linux FIFO
fifo_write.c#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <fcntl.h>#define FIFO "/tmp/myfifo"int main(void){ int nread = 0; int filefd = open("../demoFIFOWrite/test.txt",O_RDONLY); char buf原创 2020-06-17 17:01:50 · 184 阅读 · 0 评论 -
临界区和互斥锁的区别
1、临界区只能用于对象在同一进程里线程间的互斥访问;互斥体可以用于对象进程间或线程间的互斥访问。2、临界区是非内核对象,只在用户态进行锁操作,速度快;互斥体是内核对象,在核心态进行锁操作,速度慢。3、临界区和互斥体在Windows平台都下可用;Linux下只有互斥体可用互斥体对象用于进程间通信:multi_process_mutex.c#include #in原创 2016-12-21 11:41:07 · 2671 阅读 · 0 评论 -
linux 进程间通信 消息队列
消息队列是什么?消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。#include #include #include #include #include #include #define MAX_TEXT 512struct msg_st{ long int msg_type; char text[MAX_TEXT];};int main(){原创 2015-08-16 20:23:06 · 775 阅读 · 0 评论 -
linux 进程通信 IPC大全
进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区。但是,系统空间却是“公共场所”,所以内核显然可以提供这样的条件。除此以外,那就是双方都可以访问的外设了。在这个意义上,两个进程当然也可以通过磁盘上的普通文件交换信息,或者通过“注册表”或其它数据库中的某些表项和记录交换信息。广义原创 2016-05-12 09:12:55 · 597 阅读 · 0 评论 -
线程同步基础
多个线程同时访问共享数据时可能会冲突。比如两个线程都要把某个全局变量增加1,这个操作在某平台需要三条指令完成:1.从内存读变量值到寄存器2.寄存器的值加13.将寄存器的值写回内存原创 2016-11-10 21:56:43 · 336 阅读 · 0 评论 -
linux进程间通信
UNIX进程间通信(IPC)方式包括管道、有名管理(FIFO)以及信号。System V进程间通信(IPC)包括System V消息队列、System V信号量以及System V共享内存区。Posix 进程间通信(IPC)包括Posix消息队列、Posix信号量以及Posix共享内存区。 进程间通信目的数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个原创 2016-11-19 21:20:47 · 257 阅读 · 0 评论 -
linux 信号量 同步多进程
int semget(key_t key, int nsems, int semflg);int semctl(int semid, int semnum, int cmd, ...);int semop(int semid, struct sembuf *sops, unsigned nsops);原创 2016-11-14 11:16:55 · 3566 阅读 · 2 评论 -
Linux内核下载版本
http://www.kernel.org/pub/linux/kernel/v2.6/Index of /pub/linux/kernel/v2.6Name Last modified Size Parent Directory - incr/转载 2016-11-17 09:03:18 · 329 阅读 · 0 评论 -
linux 分离线程
线程的分离与结合 在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached)。一个可结合的线程能够被其他线程收回其资源和杀死;在被其他线程回收之前,它的存储器资源(如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。线程的分离状态决定一个线程以什么样的方式来终止自己。在上面的例子中,我们采用转载 2016-10-30 23:42:02 · 299 阅读 · 0 评论 -
关于inet_ntoa函数的思考
#include #include #include #include #include #include void main(){ struct in_addr addr1, addr2; unsigned int uip1, uip2; uip1 = inet_addr("127.0.0.1"); uip2 = inet_addr("172.1原创 2016-04-23 17:32:58 · 911 阅读 · 0 评论 -
linux localtime
#include #include #include int main(void){ time_t tNow = time(NULL); printf("tNow %ld\n",tNow); struct tm* ptnow = localtime(&tNow); char szTmp[64] = {0}; strftime(szTmp, si原创 2016-12-27 15:56:48 · 3546 阅读 · 0 评论 -
Linux 生产者和消费者问题
1.多个线程操作临界区要使用线程锁 2.进入临界区后等待某个条件才能继续执行,该线程一直霸占着锁,所以需要该线程主动放弃这个锁,并等待条件达到被唤醒。故出现了 pthread_cond_wait(&g_cond,&g_mutex);3.pthread_cond_wait(&g_cond,&g_mutex);背后隐藏的事情拿到锁的线程,把锁暂时丢掉(因为该函数中传入了g_mut原创 2016-08-08 15:42:21 · 642 阅读 · 0 评论 -
linux-----页、页表、页框(块)
基本介绍 我们知道,在linux操作系统中,CPU在执行一个进程的时候,都会访问内存。 但CPU并不是直接访问物理内存地址,而是通过虚拟地址空间来间接的访问物理内存地址。 所谓的虚拟地址空间,是操作系统为每一个正在执行的进程分配的一个逻辑地址,在32位机上,其范围从0 ~ 4G-1。操作系统通过将虚拟地址空间和物理内存地址之间建立映射关系,让CPU间接的访问物理内存地址。 通常将虚拟地址空...转载 2018-09-17 23:28:50 · 17529 阅读 · 1 评论 -
linux共享库基础
1、动态库的编译testa.c#include <stdio.h>#include "test.h"void TestA(){ printf("TestA func\n");}testb.c#include <stdio.h>#include "test.h"void TestB(){ printf("Test...原创 2016-11-23 11:44:57 · 254 阅读 · 0 评论 -
共享库(GCC选项_-Wl,-soname)
-Wl选项告诉编译器将后面的参数传递给链接器。-soname则指定了动态库的soname(简单共享名,Short for shared object name)soname的关键功能是它提供了兼容性的标准:当要升级系统中的一个库时,并且新库的soname和老库的soname一样,用旧库链接生成的程序使用新库依然能正常运行。这个特性使得在Linux下,升级使得共享原创 2017-04-20 09:34:37 · 2271 阅读 · 0 评论 -
Linux字符设备与块设备的区别与比较
Linux中I/O设备分为两类:块设备和字符设备。两种设备本身没有严格限制,但是,基于不同的功能进行了分类。(1) 字符设备:提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取。相反,此类设备支持按字节/字符来读写数据。举例来说,调制解调器是典型的字符设备。(2) 块设备:应用程序可以随机访问设备数据,程序可自行确定读取数据的位置。硬盘是典型的块设备,应用程序可以寻址磁盘上转载 2017-08-30 15:26:11 · 531 阅读 · 0 评论 -
Linux I/O篇
文件描述符的一些信息lili@lili-linux:~$ ulimit -acore file size (blocks, -c) 0data seg size (kbytes, -d) unlimitedscheduling priority (-e) 0file size (blo原创 2016-01-27 09:42:22 · 304 阅读 · 0 评论 -
Linux: 文件锁及其实例
1. 文件锁基本概念Linux中软件、硬件资源都是文件(一切皆文件),文件在多用户环境中是可共享的。文件锁是用于解决资源的共享使用的一种机制:当多个用户需要共享一个文件时,Linux通常采用的方法是给文件上锁,来避免共享的资源产生竞争的状态。文件锁包括建议性锁和强制性锁:建议性锁:要求每个使用上锁文件的进程都要检查是否有锁存在,并且尊重已有的锁。在一般情况下,内核和系统都不使用建转载 2017-01-17 16:56:47 · 616 阅读 · 0 评论 -
守护进程
Daemon(精灵)进程,是Linux中的后台服务进程,生存期较长的进程,通常独立于控制终 端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程编程步骤 1. 创建子进程,父进程退出 所有工作在子进程中进行 形式上脱离了控制终端 2. 在子进程中创建新会话 setsid()函数 使子进程完全独立出来,脱离控制 3. 改变当前目录为根目录原创 2017-01-17 16:08:32 · 237 阅读 · 0 评论 -
dup2函数
dup2函数跟dup函数相似,但dup2函数允许调用者规定一个有效描述符和目标描述符的id。dup2函数成功返回时,目标描述符(dup2函数的第二个参数)将变成源描述符(dup2函数的第一个参数)的复制品,换句话说,两个文件描述符现在都指向同一个文件,并且是函数第一个参数指向的文件。下面我们用一段代码加以说明:int oldfd; oldfd = open("app_log",原创 2016-04-14 17:43:53 · 3021 阅读 · 0 评论 -
C 线程池 thread_pool
#ifndef THREAD_POOL_H#define THREAD_POOL_H#include #include #include typedef void *(*process)(void *arg);typedef struct _thread_worker_t{ process fun; void *arg; struct _thread_wo原创 2016-10-28 17:18:33 · 672 阅读 · 0 评论 -
读写锁
读共享,写独占 pthread_rwlock_tpthread_rwlock_initpthread_rwlock_destroypthread_rwlock_rdlockpthread_rwlock_wrlockpthread_rwlock_tryrdlockpthread_rwlock_trywrlockpthread_rwlock_unlock原创 2016-11-10 23:06:34 · 350 阅读 · 0 评论 -
linux 信号
#include #include #include #include #include #include #include #include #include char buf[1024];void signal_handler(int type){ switch (type) { case SIGINT: printf("catch SIGINT\n");原创 2015-12-02 14:10:18 · 367 阅读 · 0 评论 -
ubuntu 12.04安装配置samba
第一步:安装samba服务器Samba服务在Ubuntu12.04版本中中默认安装,对于其他没有默认安装的版本来说,可以通过一下命令来安装所需要的软件: 1:sudo apt-get install samba 2: sudo apt-get install smbclient第二步:gedit /etc/samba/sm原创 2015-11-29 19:11:07 · 410 阅读 · 0 评论 -
Linux makefile 教程
最近在学习Linux下的C编程,买了一本叫《Linux环境下的C编程指南》读到makefile就越看越迷糊,可能是我的理解能不行。 于是google到了以下这篇文章。通俗易懂。然后把它贴出来,方便学习。 后记,看完发现这篇文章和《Linux环境下的C编程指南》的makefile一章所讲述的惊人的相似,只是这篇文章从一个实例切入,在有些地方比较好理解转载 2015-10-13 14:57:23 · 734 阅读 · 0 评论 -
Linux系统调用列表
以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数。这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完全也是很罕见的。按照惯例,这个列表以manpages第2节,即系统调用节为蓝本。按照笔者的理解,对其作了大致的分类,同时也作了一些小小的修改,删去了几个仅供内核使用,不允许用户调用的系统调用,对个转载 2015-09-20 22:44:59 · 431 阅读 · 0 评论 -
Linux 文件和目录操作的相关函数
1. 文件状态数据结构[cpp] view plaincopystruct stat { mode_t st_mode; //文件类型,文件权限 ino_t st_ino; //i节点号 dev_t st_dev; dev_t st_rdev; //设备文件序号转载 2015-09-20 22:32:25 · 351 阅读 · 0 评论 -
unix man使用
在unix下面做开发,查看man手册是非常必要,也是非常需要的。如何更快速的使用man? 当然,平时有不会的命令,或者记不住命令的参数时,就会man一下,可是在unix man手册里有这样一个现象,比如你想查看一下read()这个C库函数的功能和参数以及用法。man read其结果呢?只会出shell的read命令的相关帮助信息,没有出现read()库函数的相关内容。why?原创 2015-09-19 23:03:30 · 630 阅读 · 1 评论 -
每个程序员都应该知道的8个Linux命令
摘要:Linux里有很丰富的各种命令,有些是很难用的。然而,学会了前面说的这8个命令,你已经能处理大量的log分析任务了,完全不需要用脚本语言写程序来处理它们。每个程序员,在职业生涯的某个时刻,总会发现自己需要知道一些Linux方面的知识。我并不是说你应该成为一个Linux专家,我的意思是,当面对Linux命令行任务时,你应该能很熟练的完成。事实上,学会了下面8个命令,我基本上能完成任何需要完转载 2015-09-18 11:27:58 · 404 阅读 · 1 评论 -
linux之gcc基础
gcc -o opendir.o -c opendir.c-c只编译,不链接#include #include void add();void add(int i);void add(int i,char *);int main(void){ add(); add(1); add(1,""); if(access("/etc/passwd", R_OK)==0)原创 2015-09-16 15:34:17 · 368 阅读 · 1 评论 -
linux shell基础
$# 表示参数的总数$i 表示第i个参数 (第0个数参数本身)$* 表示所有参数#! /bin/shecho $#echo $1echo $*./abc 109.123.120.209 8080res:2109.123.120.209109.123.120.209 8080原创 2016-01-06 11:32:34 · 283 阅读 · 0 评论 -
创建线程可分离状态的属性
#include #include #include void *func(void * argc){ while(1) { sleep(1); printf("hello\n"); } return NULL;}int main(int argc, char *argv[]){ pthread_t pthid; pthread_attr_t at原创 2015-12-08 10:16:30 · 601 阅读 · 0 评论 -
虚拟文件系统中的数据结构(fs_struct、files_struct)
虚拟文件系统中的数据结构(fs_struct、files_struct) 1、与进程相关的文件首先,文件必须由进程打开,每个进程都有它自己当前的工作目录和它自己的根目录。task_struct的fs字段指向进程的fs_struct结构,files字段指向进程的files_struct结构。 struct fs_struct { atomic_t cou转载 2016-03-24 17:12:02 · 2304 阅读 · 0 评论 -
linux makefile模板
.SUFFIXES: .cpp .o pkg_packages :=ecorePKG_CFLAGS := $(shell pkg-config --cflags $(pkg_packages))PKG_LDFLAGS := $(shell pkg-config --libs $(pkg_packages))CFLAGS := $(PKG_CFLAGS) $(CFLAGS)LDFLAGS原创 2015-10-13 15:00:55 · 474 阅读 · 0 评论 -
linux 进程控制 fork
#include /* 提供类型pid_t的定义 */#include pid_t wait(int *status)进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一原创 2015-11-30 17:17:40 · 598 阅读 · 0 评论 -
Linux 进程环境
进程终止:C程序的终止分为两种: 正常终止和异常终止.正常终止分为: 1.main函数return, 2.exit3._exit或 _Exit4.最后一个线程返回5.最后一个线程pthreade_exit异常中指分为: abort, SIGNAL, 线程响应取消#include #include pthread_t pid = 1原创 2016-08-11 09:54:05 · 294 阅读 · 0 评论 -
pthread_attr_setdetachstate
在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached)。一个可结合的线程能够被其他线程收回其资源和杀死;在被其他线程回收之前,它的存储器资源(如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。 线程的分离状态决定一个线程以什么样的方式来终止自己。在默认情况下线程是非分离状态的,这种情况转载 2016-08-08 14:51:14 · 362 阅读 · 0 评论 -
dlopen dlsym dlclose dlerror
// gcc -fpic -shared -o myso.so myso.c#include //filename:myso.c#include void show() { printf("Standard Object by gashero\n");}void set(int *data){ *data = 12;} //原创 2016-08-05 14:02:53 · 492 阅读 · 0 评论 -
详解wait和waitpid函数
#include /* 提供类型pid_t的定义 */#include pid_t wait(int *status)进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。转载 2016-04-24 00:18:58 · 418 阅读 · 0 评论 -
三次握手是在accept之前完成的
server.c#include #include #include #include #include #include #include #include #include #include #include #include #include #include /* int socket(int domain, int type, int prot原创 2016-04-23 22:22:45 · 821 阅读 · 0 评论