学习笔记09-学习《精通UNIX下C语言编程及项目实践》

C 语言的发展 C 编程语言诞生于 20 世纪 70 年代初期,是新兴 Unix 操作系统的系统实现语言。它源自无类型语言 BCPL,并发展出一种类型结构;它诞生于一台微型机器上,作为改善简陋编程环境的工具,如今已成为当今的主流语言之一。本文研究了 C 语言的演变。注:*版权所有 1993 美国计算机协会。本电子重印本由作者免费提供。如需进一步的出版权,请联系 ACM 或作者。本文于 1993 年 4 月在马萨诸塞州剑桥举行的第二届编程语言史会议上发表。 随后,它被收录在会议论文集: 编程语言史-II 版,Thomas J 阅读详情

  十三章 信号量

  进程间的通信不仅仅包括数据交流 , 也包括过程控制 .

  信号量是一个可以用来控制进程存储共享资源的计数器 , 它可以是跟踪共享资源的生产和消费的计数器 , 也可以是协调资源的生产者和消费者之间的同步器 , 还可以是控制生产进程和消费进程的互斥开关 .

  信号量简介

  操作系统通过信号量和 PV 操作 , 可以完成同步和互斥操作 .

  信号量集合由一个或多个信号量集合组成 , IPC 对象中的 ' 信号量 ' 通常指的是信号量集合 , UNIX 的内核采用结构 semid_ds 来管理信号量 , 结构如下 :

struct semid_ds {

        struct ipc_perm sem_perm;               /* permissions .. see ipc.h */

        __kernel_time_t sem_otime;              /* last semop time */

        __kernel_time_t sem_ctime;               /* last change time */

        struct sem      *sem_base;              /* ptr to first semaphore in array */

        struct sem_queue *sem_pending;          /* pending operations to be processed */

        struct sem_queue **sem_pending_last;    /* last pending operation */

        struct sem_undo *undo;                  /* undo requests on this array */

        unsigned short  sem_nsems;              /* no. of semaphores in array */

};

  指针 sem_base 指向一个信号量数组 , 信号量由结构 sem 记载 , 如下所示 :

Struct sem{

    unsigned short semval;       // 信号量取值

    pid_t sempid;              // 最近访问进程 ID

    unsigned short semncnt;      // P 阻塞进程数

    unsigned short semzcnt;      // Z 阻塞进程数

}

  在 Shell 中可以通过 'ipcs -a -s' 命令查询系统中信号量的基本信息 .

  (1) 信号量的创建

  在 UNIX 中 , 函数 semget 用来创建信号量 , 原型如下 :

#include <sys/sem.h>

int semget(key_t key, int nsems, int semflg);

  函数 semget 创建一个新的信号量 , 或者访问一个已经存在的信号量 .

  (2) 信号量的控制

  系统调用 semctl 用来控制信号量 , 原型如下 :

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

int semctl(int semid, int semnum, int cmd, ...);

  函数 semctl 对标识号为 semid 的信号量集合中序号为 semnum 的信号量进行赋值 , 初始化 , 信息获取和删除等多相操作 , 参数 cmd 指定了操作的类型 , 参数 arg 指定了函数输入输出的缓冲区 , 定义如下 :

union semun {

        int val;                        /* value for SETVAL */

        struct semid_ds *buf;           /* buffer for IPC_STAT & IPC_SET */

        unsigned short *array;          /* array for GETALL & SETALL */

        struct seminfo *__buf;          /* buffer for IPC_INFO */

        void *__pad;

};

  函数 semctl 的第四个参数 arg 在本质上是一个 4 字节的缓冲区 . 调用失败时返回 -1 并置 errno.

  本处设计一个类似于命令 'ipcs' 和命令 'ipcrm' 的程序 ipcsem, 它从命令行参数中获取要执行的操作 , 包括创建信号量 , 读取信号量信息 , 读取信号量取值和删除信号量等 , 程序如下 :

#include <sys/sem.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/stat.h>

#include <stdio.h>

 

#define VerifyErr(a, b)  /

        if (a) fprintf(stderr, "%s failed./n", (b));  /

        else fprintf(stderr, "%s success./n", (b));

 

int main(int argc, char *argv[1])

{

        int semid, index, i;

        unsigned short array[100];

        struct semid_ds ds;

       

        if(argc != 4)

                 return 0;

        semid = atoi(argv[1]);

        index = atoi(argv[2]);

        if(argv[3][0] == 'c'){

                 VerifyErr(semget(semid, index, 0666|IPC_CREAT|IPC_EXCL) < 0, "Create sem");

        }

        else if(argv[3][0] == 'd'){

                 VerifyErr(semctl(semid, 0, IPC_RMID, NULL) < 0, "Delete sem");

        }

        else if(argv[3][0] == 'v'){

                 fprintf(stderr, "T    ID    INDEX    SEMVAL    SEMIPID    SEMNCNT    SEMZCNT/n");

                 fprintf(stderr, "s %6d %6d %10d %10d %10d %10d/n", semid, index,

                          semctl(semid, index, GETVAL), semctl(semid, index, GETPID),

                          semctl(semid, index, GETNCNT), semctl(semid, index, GETZCNT));

        }

        else if(argv[3][0] == 'a'){

                 ds.sem_nsems = 0;

                 VerifyErr(semctl(semid, 0, IPC_STAT, &ds) != 0, "Get Sem Stat");

                 VerifyErr(semctl(semid, 0, GETALL, array) != 0, "Get Sem All");

                 for(i=0;i<ds.sem_nsems;i++)

                          fprintf(stderr, "sem no [%d]: [%d]/n", i, array[i]);

        }

        else

                 VerifyErr(semctl(semid, index, SETVAL, atoi(argv[3])) != 0, "Set Sem Val");

 

        return 0;

}

  执行结果如下 :

[bill@billstone Unix_study]$ make ipcsem

cc     ipcsem.c   -o ipcsem

[bill@billstone Unix_study]$ ipcs -s

 

------ Semaphore Arrays --------

key        semid      owner      perms      nsems

0x000003e8 0          bill      666        10

 

[bill@billstone Unix_study]$ ./ipcsem 2000 2 c

Create sem success.

[bill@billstone Unix_study]$ ipcs -s

 

------ Semaphore Arrays --------

key        semid      owner      perms       nsems

0x000003e8 0          bill      666        10

0x000007d0 65537      bill      666        2

 

[bill@billstone Unix_study]$ ./ipcsem 65537 0 100

Set Sem Val success.

[bill@billstone Unix_study]$ ./ipcsem 65537 0 v

T    ID    INDEX    SEMVAL    SEMIPID    SEMNCNT    SEMZCNT

s  65537      0        100      23829          0          0

[bill@billstone Unix_study]$ ./ipcsem 65537 1 200

Set Sem Val success.

[bill@billstone Unix_study]$ ./ipcsem 65537 0 a

Get Sem Stat success.

Get Sem All success.

sem no [0]: [100]

sem no [1]: [200]

[bill@billstone Unix_study]$ ./ipcsem 65537 0 d

Delete sem success.

[bill@billstone Unix_study]$ ipcs -s

 

------ Semaphore Arrays --------

key        semid      owner      perms      nsems

0x000003e8 0          bill      666         10

 

[bill@billstone Unix_study]$

  操作信号量

  信号量具有 P, V 和 Z 三种操作 , 在 UNIX 中 , 这些操作可以通过函数 semop 调用完成 , 函数 semop 可以一次性操作同一信号量集合中的多个信号量 . 原型如下 :

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

int semop(int semid, struct sembuf *sops, unsigned nsops);

    函数 semop 对标识号为 semid 的信号量集合中的一个或多个信号量执行信号数值的增加 , 减少或比较操作 . 参数 sops 指向一个 sembuf 结构的缓冲区 , nsops 指定了缓冲区中存储的 sembuf 结构的个数 .

struct sembuf {

        unsigned short  sem_num;        /* semaphore index in array */

        short           sem_op;         /* semaphore operation */

        short           sem_flg;        /* operation flags */

};

  其中 , 第一个信号的序号是 0. sem_op 指定了操作的类型 :

  a) 正数 . V 操作 .

  b) 负数 . P 操作 .

  c) 0 . Z 操作 . 判断信号量数值是否等于 0.

  而 sem_flg 取值有 IPC_NOWAIT 和 SEM_UNDO 等 .

  下面是一个用于临界资源的读写控制和并发进程的同步和互斥控制的实例 : 假设进程 A 是生产者 , 进程 B 是消费者 , 系统最多只能同时容纳 5 个产品 , 初始成品数为 0. 当产品数不足 5 时允许进程 A 生产 , 当产品数超过 0 时允许进程 B 消费 .

  这里需要两个信号量模拟生产 - 消费过程 . 信号量 A 代表了当前生产的数目 , 它控制了生产者进程 A, 信号量 n 代表当前尚有 n 个成品可以生产 .

  信号 B 代表了当前的产品数 , 他控制消费者进程 B, 当信号量为 n 时剩余 n 个产品 .

  生产者进程 sema.c 如下 :

[bill@billstone Unix_study]$ cat sema.c

#include <sys/sem.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <stdio.h>

#include <sys/stat.h>

 

#define VerifyErr(a,b) /

        if (a) { fprintf(stderr, "%s failed./n", (b)); exit(1); } /

        else fprintf(stderr, "%s success./n", (b));

 

int main(void)

{

        int semid;

         struct sembuf sb;

 

        VerifyErr((semid = semget(2000, 2, 0666)) < 0, "Open Sem 2000");

        sb.sem_num = 0;

        sb.sem_op = -1;

        sb.sem_flg &= ~IPC_NOWAIT;

        VerifyErr(semop(semid, &sb, 1) != 0, "P sem 2000:0");

        fprintf(stderr, "[%d] producing ... ... /n", getpid());

        sleep(1);

        fprintf(stderr, "[%d] produced/n", getpid());

        sb.sem_num = 1;

        sb.sem_op = 1;

        sb.sem_flg &= ~IPC_NOWAIT;

        VerifyErr(semop(semid, &sb, 1) != 0, "V sem 2000:1");

 

        return 0;

}

[bill@billstone Unix_study]$

  消费者进程 semb.c 如下 :

[bill@billstone Unix_study]$ cat semb.c

#include <sys/sem.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <stdio.h>

#include <sys/stat.h>

 

#define VerifyErr(a,b) /

         if (a) { fprintf(stderr, "%s failed./n", (b)); exit(1); } /

        else fprintf(stderr, "%s success./n", (b));

 

int main(void)

{

        int semid;

        struct sembuf sb;

 

        VerifyErr((semid = semget(2000, 2, 0666)) < 0, "Open Sem 2000");

        sb.sem_num = 1;

        sb.sem_op = -1;

        sb.sem_flg &= ~IPC_NOWAIT;

        VerifyErr(semop(semid, &sb, 1) != 0, "P sem 2000:1");

        fprintf(stderr, "[%d] consuming ... ... /n", getpid());

        sleep(1);

        fprintf(stderr, "[%d] consumed/n", getpid());

        sb.sem_num = 0;

        sb.sem_op = 1;

        sb.sem_flg &= ~IPC_NOWAIT;

        VerifyErr(semop(semid, &sb, 1) != 0, "V sem 2000:1");

 

        return 0;

}

[bill@billstone Unix_study]$

  编译程序并使用之前的程序 ipcsem 创建信号量集合 :

[bill@billstone Unix_study]$ ./ipcsem 2000 2 c

Create sem success.

[bill@billstone Unix_study]$ ipcs -s

 

------ Semaphore Arrays --------

key        semid      owner      perms      nsems

0x000003e8 0          bill      666        10

0x000007d0 98305      bill      666        2

 

[bill@billstone Unix_study]$ ./ipcsem 98305 0 5

Set Sem Val success.

[bill@billstone Unix_study]$ ./ipcsem 98305 1 0

Set Sem Val success.

[bill@billstone Unix_study]$ ./ipcsem 98305 0 a

Get Sem Stat success.

Get Sem All success.

sem no [0]: [5]

sem no [1]: [0]

[bill@billstone Unix_study]$

  在一个终端上运行 sema:

[bill@billstone Unix_study]$ ./ipcsem 98305 0 a

Get Sem Stat success.

Get Sem All success.

sem no [0]: [3]

sem no [1]: [2]

[bill@billstone Unix_study]$ ./sema

Open Sem 2000 success.

P sem 2000:0 success.

[23940] producing ... ...

[23940] produced

V sem 2000:1 success.

[bill@billstone Unix_study]$ ./ipcsem 98305 0 a

Get Sem Stat success.

Get Sem All success.

sem no [0]: [2]

sem no [1]: [3]

[bill@billstone Unix_study]$

  在另一个终端上执行 semb:

[bill@billstone Unix_study]$ ./ipcsem 98305 0 a

Get Sem Stat success.

Get Sem All success.

sem no [0]: [2]

sem no [1]: [3]

[bill@billstone Unix_study]$ ./semb

Open Sem 2000 success.

P sem 2000:1 success.

[23942] consuming ... ...

[23942] consumed

V sem 2000:1 success.

[bill@billstone Unix_study]$ ./ipcsem 98305 0 a

Get Sem Stat success.

Get Sem All success.

sem no [0]: [3]

sem no [1]: [2]

[bill@billstone Unix_study]$

 读者可以试着连续执行sema几次,观察进程的P阻塞状态。

用rsl_rl训练四足机器人走梅花桩:PPO算法调参实战与避坑指南 本文详细介绍了如何使用rsl_rl框架和PPO算法训练四足机器人在梅花桩上行走的实战经验。通过分析梅花桩场景的独特挑战,提供PPO算法关键参数配置策略、奖励函数设计方法以及常见问题的解决方案,帮助开发者高效实现机器人平衡控制。文章特别强调了仿真到实机的过渡技巧,最终实现98%的过桩成功率。 阅读详情

相关推荐

手把手教你使用HFSS仿真高速差分过孔—上

高速数字电路设计中,信号完整性是一个非常重要的问题。为了使信号保持良好的传输特性,PCB板上的互联线一般都采用均匀传输线,使互联线保持特性阻抗一致性,减少信号反射。然而PCB板上的互联线很多时候避免不了换层的问题,这时候就必须使用过孔。过孔会导致阻抗不连续,进而造成反射,出现信号完整性问题。         当信号传输速率越高,信号前沿越短的时候,过孔引入的信号完整性问题越严重,需要对过孔进行优

a2447944219的博客 2万+

C语言概述(郝斌09年版网课学习笔记)

第一代语言是机器语言(1、0二进制)如0000 0001 1101 10000第二代语言是汇编语言(把0101此类二进制代码翻译成一些英文单词(对应二进制指令) (ADD AX,BX)第三代高级语言 (以八十年代分界线,因为结构化的语言有缺陷,后有面向对象的)汇编语言将机器语言翻译为英文,而高级语言更智能化但速度最慢并不能被直接执行,机器语言最快,其次汇编语言,最慢是高级语言。高级语言中C语言最快,其次C++,然后是JAVA和C#)

ELELADY的博客 952

电力现货市场出清机制与节点电价计算实战解析

本文深入解析了电力现货市场的出清机制,特别是节点边际电价的计算原理与实战应用。通过一个基于Matlab和IEEE30节点系统的完整案例,详细演示了如何利用最优潮流模型求解市场出清价格,并提取节点电价,揭示了电网阻塞如何影响实时电价的形成。

weixin_29061425的博客 950

UNIX下C语言编程与实践17-UNIX i 节点详解:文件属性存储与数据块地址映射机制

i节点是UNIX文件系统的核心组件,充当文件的“身份证”(存储属性)和“地址簿”(记录数据块位置)。其特点包括:文件名与i节点分离设计(支持硬链接)、多级索引结构(优化大小文件存储)。通过ls -i和stat命令可查看i节点信息,常见问题包括i节点损坏或耗尽,需通过文件系统修复或清理解决。硬链接与符号链接的本质差异在于是否共享i节点:硬链接指向同一i节点,而符号链接是独立文件存储目标路径。理解i节点机制对UNIX系统管理、故障排查及性能优化至关重要。

文石_2009的博客 956

多IMU车载GNSS/INS数据集及介绍

文章目录前言非常棒的GINS数据集采集轨迹采集时间MEMS IMU详细信息IMU测量值方程及相关误差建模参考噪声参数安装参数文件格式描述 前言 “本文作者感谢武汉大学多源智能导航实验室和牛小骥教授提供了本文所需的GNSS/INS数据集。” 本博文介绍数据集链接为多IMU车载GNSS、INS数据集,欢迎大家下载,由于是开源数据集,因此下载不需要积分 非常棒的GINS数据集 这是一套非常好的用于GNSS/INS组合导航应用的车载数据集,本数据集采集于湖北省武汉市一处工业园区,为开阔天空场景,GNSS R

十八与她的博客 6441

CAD文件转换避坑指南:Inventor导出STP时这些设置千万别忽略

本文深入解析了使用Autodesk Inventor导出STP文件时的关键设置与避坑指南。重点探讨了应用协议选择、样条曲线拟合精度对几何保真度的影响,以及装配体结构和元数据的保全策略,旨在帮助用户实现高质量、零误差的CAD数据交付,避免下游软件打开时出现特征丢失或曲面破碎等问题。

weixin_29214559的博客 518

第一章:开始学习C语言-1介绍C语言

这篇文章将帮你了解C语言,它的历史,主要特点和应用。C语言是1970年发明的一种通用的过程式编程语言。C语言适用于操作系统、数据库系统、图形软件等系统编程。游戏引擎。最后编辑于:2024-09-22 09:32:39©著作权归作者所有,转载或内容合作请联系作者。

pingguocu3的博客 1068

自绘CListCtrl时发现ON_WM_MEASUREITEM_REFLECT和DrawItem(LPDRAWITEMSTRUCT lpMeasureItemStruct) 无响应

自绘CListCtrl时发现ON_WM_MEASUREITEM_REFLECT和DrawItem(LPDRAWITEMSTRUCT lpMeasureItemStruct) 无响应 一般情况下,我们都是在 dialog 里面 放一个 list 控件,然后 用自己的类绑定自己的自绘对象,如同下面: 1.  在 dialog 里面 加一个 list 列表 2. 然后 绑定这个列表 哈哈...

mfreesky的专栏 2171

Linux学习笔记09 -- 超详细shell脚本编程快速入门

文章目录1.shell简介1)什么是shell2)shell脚本3)运行shell脚本4)shell注释5)shell编写的基本步骤2.shell变量1)命名变量2)使用变量3)变量类型3)变量操作3.shell字符串1)字符串类型2)字符串操作4.shell数组1)定义数组2)数组操作5.shell传递参数6.shell运算符1)shell运算符种类2)算数运算符3)关系运算符4)布尔运算符5)...

Freedom_Blue的博客 7万+

MCAL知识点(十):ERU驱动配置详解

ERS:外部请求单元ETL:中断逻辑单元OGU:输出逻辑单元MCU里面配置要使用的功能和选择输入的管脚,注意上述模块关注点讲述的ERU必须和边沿检测模块相关联。

梦想技术家 1223

杰理AC696N系列芯片外部中断使用教程

本教程详细介绍了杰理AC696N芯片的GPIO引脚中断唤醒功能实现方法。主要内容包括: 功能特点: 支持任意GPIO引脚配置为中断源 可灵活选择上升沿或下降沿触发 提供自定义中断回调函数接口 核心实现: 通过port_wkup_interrupt_init()函数配置GPIO属性 使用request_irq()注册中断服务程序 提供中断使能/关闭接口 注意事项: 此功能在低功耗模式下无效 需注意引脚冲突和中断优先级设置 建议在回调函数中实现简洁的逻辑 应用场景: 按键检测 外部信号监测 事件触发等 本方案提

qq_42014563的博客 944

C语言时间转换 Unix 时间

C语言中Unix时间戳转换的基本框架,可以根据实际需求进行修改和扩展。其提供常用的时间转换函数,用于在Unix时间戳和人类可读的时间格式之间进行转换。本文主要介绍这些接口的使用方法。

mftang的博客 1421

QT Android开发之Android端usb调试模式设置与问题解决

QT Android开发之Android端usb调试模式设置与问题解决 一.QT android开发android端usb调试模式设置 QT android开发环境搭建完成后,android设备需要打开usb调试模式才能正常连接,下面以小米ipad为例进行设置(其他手机和ipad设置方法类似) 二.小米ipad打开usb调试模式 1.设置----我的设备-----全部参数信息-----OS版本---点击这里6次以上就进入开发者模式。

热土程序园,利他愉己~ 1130

09.12.13 linux/unix编程学习途径 关于个人技术发展的一些考量

下面的这个inux/unix编程学习途径在网上很多地方都可以看到,这里转过来(有删减),以作为对自己的一个提醒。 1、首先先学学编辑器,vim, emacs什么的都行。2、然后学make file文件,只要知道一点就行,这样就可以准备编程序了。 3、然后看看《C程序设计语言》K&R,这样呢,基本上就可以进行一般的编程了,顺便找本数据结构的书来看。 4、如果想学习UNIX/LINUX

jamestaosh 1185

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【10个超赞的C语言开源项目】【转载】

今天给大家分享10个超赞的C语言开源项目,希望这些内容能对大家有所帮助!

j8267643的博客 1124

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

强烈推荐!10个超赞的C语言开源项目

的内核源代码包括设备驱动程序在内约有 1 万行,这个数量的源代码,初学者是能够充分理解的。基于 Reactor 模式,效率较高,并且代码精简(4.15 版本 8000 多行),是学习事件驱动编程的很好的资源。由于简洁的设计和先进的特征,使得它在生产和研究方面,都有卓越的表现,而且它也有受使用者支持的完整的源代码。另一方面,最近的操作系统,例如 Linux 最新版的内核源代码据说超过了 1000 万行。是C语言中的一个JSON编解码器,非常轻量级,C文件只有 500 多行,速度也非常理想。

jk_101的博客 4248

C语言, 值得终身使用的编程工具

转自:tfisher的专栏http://blog.youkuaiyun.com/tfisher/archive/2004/07/09/37707.aspx     职业程序员10来年了,其中的酸甜苦辣真是只有过来人才能体会。身处计算机技术高速的发展的时代中,确实感觉累,特别是在选择编程工具时,新的语言和可选择的语言太多。若立志作为一个职业的并愿意深入研究的程序员,我建议选择C语言。记得高中开始计算

perddy的专栏 1123

10 个超赞的 C 语言开源项目

C语言项目

Linuxer_Martin 2054

Unix 传奇 | 谁写了 Linux | Unix birthmark

……

u013669912的博客 1299

C语言实现Unix时间戳和北京时间的相互转换(已编译,亲试可用~)

目录 一、什么是Unix时间戳 一、什么是Unix时间戳     1、unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。     2、unix时间戳需要先加上8个小时(即8 * 60 * 60 s)的秒数差,再进行转换得到北京时间。     3、实用工具传送门 → Unix时间戳和北京时间在线转换工具 ...

小肥丸 5552

09年开发语言使用率前景分析

  计算机在中国被大众所接受已经有十几个年头了,近几年,更是成为了人们在工作中不可或缺的重要工具.而开发语言对于IT行业从业者来说,也并不在陌生,谈到开发语言,也许每个人都能说出来几种或十几种.那么目前通用的编程语言有两种形式:分别是汇编语言和高级语言。汇编语言的实质和机器语言是相同的,都是直接对硬件操作,只不过指令采用了英文缩写的标识符,更容易识别和记忆。高级语言是目前绝大多数编程者的选

dengxingbo的专栏 627

UNIX下C语言编程与实践22-UNIX 文件其他属性获取:stat 结构与 localtime 函数的使用

本文深入解析UNIX系统中stat结构体的文件属性获取与处理方法。主要内容包括:1) 详细剖析stat结构体中的关键字段,如硬链接数、所有者ID、文件大小和时间戳等;2) 通过C语言实战演示如何实现GetFileOtherAttr函数,完整获取并格式化文件属性;3) 重点讲解localtime函数的时间戳转换机制,包括structtm结构体解析和线程安全问题;4) 拓展介绍ctime、mktime等时间相关函数的使用场景;5) 总结常见问题及解决方法。掌握这些知识可实现UNIX文件属性的全面管控,为系统管理

文石_2009的博客 504

10 个不错的 C 语言开源项目

UNIX V6 的内核源代码包括设备驱动程序在内约有 1 万行,这个数量的源代码,初学者是能够充分理解的。基于 Reactor 模式,效率较高,并且代码精简(4.15 版本 8000 多行),是学习事件驱动编程的很好的资源。由于简洁的设计和先进的特征,使得它在生产和研究方面,都有卓越的表现,而且它也有受使用者支持的完整的源代码。cJSON是C语言中的一个JSON编解码器,非常轻量级,C文件只有 500 多行,速度也非常理想。其代码被非常好地维护着,结构也简单易懂,可以作为一个非常好的C语言项目进行学习。

Linuxer_Martin 454

《C程序设计语言》读书笔记09: UNIX 系统接口

在UNIX系统中,所有I/O操作最终都通过文件描述符(File Descriptor)进行。文件描述符是一个小的非负整数,用于标识进程打开的文件。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;内核进程fd=0 stdin文件表01102420/* 最大同时打开文件数 */int cnt;/* 剩余字符数 */char *ptr;

4229

学习笔记—C语言基础篇09

C语言中有三个特殊的文件指针由系统默认打开,用户无需定义即可直接使用: stdin: 标准输入,默认为当前终端(键盘),我们使用的scanf、getchar函数默认从此终端获得数据。 stdout:标准输出,默认为当前终端(屏幕),我们使用的printf、puts函数默认输出信息到此终端。 stderr:标准出错,默认为当前终端(屏幕),我们使用的perror函数默认输出信息

浮生 若梦 442
上一篇: 学习笔记08-学习《精通UNIX下C语言编程及项目实践》
下一篇: 学习笔记10-学习《精通UNIX下C语言编程及项目实践》
BillStone
博客等级 码龄24年 65粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值