当前位置: 首页 > 编程日记 > 正文

UNIX环境编程

linux函数分析查询工具

1.优先推荐linux 中man命令

2.一个不错的中文Linux手册:http://cpp.ezbty.org/manpage

3.在线查英文Man手册:

http://www.kernel.org/doc/man-pages/

http://man7.org/linux/man-pages/dir_all_alphabetic.html



http://linux.about.com/od/commands/l/blcmdl.htm

http://linux.die.net/man/

http://www.linuxmanpages.com/

man 命令

部分内容
man1一般命令。这个部分中的命令通常不需要超级用户(即管理员)特权。lscatpasswd 放在这里,还有 shell。例如,请试试 man bash
man2用来访问 UNIX 内核提供的服务的系统调用或函数。例如 fork 系统,它从一个现有的进程生成一个新进程。输入 man fork 显示它的手册页。使用系统软件的程序员常常参考这个部分。
man3C 库函数。许多软件包提供功能丰富的代码库,让开发人员可以创建新软件来补充现有的特性或开发全新的特性。每个库通常有一个手册页;一些库(比如系统的 libc)太大了,所以各个函数或一组相关函数有单独的文档。
man4特殊文件,比如设备和驱动程序。
man5文件格式。UNIX 几乎完全使用文本配置文件定制系统的操作。有大量配置文件,包括网络服务的列表 (/etc/services) 和可用的 shell 列表 (/etc/shells) 等等。
man6游戏和屏幕保护程序。
man7杂类文件。这是一个包罗万象的类别。在传统的系统上,可以了解 glob 操作符、正则表达式等方面的信息。
man8系统管理命令,超级用户很可能要使用它们。

在某些情况下,不同部分中的组件可能名称相同。这种现象很常见,尤其是在一个软件包有多个部分的情况下。例如,第一部分中有 crontab 命令,它提交要调度的作业。同时,第五部分中有 crontab 文件格式,它描述要运行的作业。

为了区分不同部分中的同名组件,应该在第一个参数中提供部分号:

$ man 1 crontab
$ man 5 crontab

前一个命令显示 crontab 命令的手册页;后一个命令显示 crontab 文件格式。如果一个软件在多个部分中存在,而您没有指定部分号,man 就会显示在编号最低的部分中找到的匹配。


使用-k的man命令可根据关键字搜索

#man -k fork


看第一行就是我们需要的信息,加上小节号

#man 2 fork

从这里我们知道在unistd.h中有fork

该头文件在/usr/include中

#/usr/include

#vim  unistd.h


库函数和系统调用的区别

库函数是高层的,完全运行在用户空间,为程序员提供调用真正的在幕后完成实际事务的系统调用的更方便的接口。系统调用在内核态运行并且由内核自己提供。标准C库函数printf()可以被看做是一个通用的输出语句,但它实际做的是将数据转化为符合格式的字符串并且调用系统调用 write()输出这些字符串。

是否想看一看printf()究竟使用了哪些系统调用? 这很容易,编译下面的代码。

#include <stdio.h>
int main(void)
{
printf("hello");
return 0;
}		 

使用命令gcc -Wall -o hello hello.c编译或者直接cc编译a.out文件。

用命令

#strace ./hello

或者

#strace ./a.out

跟踪该可执行文件


每一行都和一个系统调用相对应。 strace是一个非常有用的程序,它可以告诉你程序使用了哪些系统调用和这些系统调用的参数、返回值。 这是一个极有价值的查看程序在干什么的工具。在输出的末尾,你应该看到这样类似的一行 write(1, "hello", 5hello)。这就是我们要找的。藏在面具printf() 的真实面目。既然绝大多数人使用库函数来对文件I/O进行操作(像 fopen, fputs, fclose)。 你可以查看man说明的第二部分使用命令man 2 write 。man说明的第二部分专门介绍系统调用(像kill()read())。 man说明的第三部分则专门介绍你可能更熟悉的库函数(像cosh()random())。



1.getenv

NAME         

       getenv, secure_getenv - get an environment variable

SYNOPSIS         

       #include <stdlib.h>char *getenv(const char *name);char *secure_getenv(const char *name);Feature Test Macro Requirements for glibc (see feature_test_macros(7)):secure_getenv(): _GNU_SOURCE

http://man7.org/linux/man-pages/man3/getenv.3.html

函数说明 getenv()用来取得参数name环境变量的内容。参数name为环境变量的名称,如果该变量存在则会返回指向该内容的指针。环境变量的格式为name=value。
返回值:执行成功则返回指向该内容的指针,找不到符合的环境变量名称则返回NULL。


2.putenv

NAME         

       putenv - change or add an environment variable

SYNOPSIS         

       #include <stdlib.h>int putenv(char *string);Feature Test Macro Requirements for glibc (see feature_test_macros(7)):putenv(): _SVID_SOURCE || _XOPEN_SOURCE
http://man7.org/linux/man-pages/man3/putenv.3.html

函数说明:putenv()用来改变或增加环境变量的内容。参数string的格式为name=value,如果该环境变量原先存在,则变量内容会依参数string改变,否则此参数内容会成为新的环境变量。
返回值:执行成功则返回0,有错误发生则返回-1。
错误代码:ENOMEM 内存不足,无法配置新的环境变量空间。


3.setenv

NAME         

       setenv - change or add an environment variable

SYNOPSIS         

       #include <stdlib.h>int setenv(const char *name, const char *value, int overwrite);int unsetenv(const char *name);Feature Test Macro Requirements for glibc (see feature_test_macros(7)):setenv(), unsetenv():_BSD_SOURCE || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600
http://man7.org/linux/man-pages/man3/setenv.3.html

函数说明: setenv()用来改变或增加环境变量的内容。

参数 name为环境变量名称字符串。
参数 value则为变量内容。

参数 overwrite用来决定是否要改变已存在的环境变量。如果overwrite不为0,则改变环境变量原有内容,原有内容会被改为参数value所指的变量内容。如果overwrite为0,且该环境变量已有内容,则参数value会被忽略。

返回值: 执行成功则返回0,有错误发生时返回-1。

错误代码: ENOMEM 内存不足,无法配置新的环境变量空间


#include <stdio.h>
#include <stdlib.h>
main()
{
char *p;
if((p = getenv("USER")))
printf("USER=%s\n",p);
putenv("USER=root");
printf("USER=%s\n",getenv("USER"));
setenv("USER","test",1);
printf("USER=%s\n",getenv("USER"));
unsetenv("USER");
printf("USER=%s\n",getenv("USER"));
}

输出:

USER=root
USER=test
USER=test
USER=(null)


4.printf的buffer缓冲

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main(void)
{int i;for(i=0; i<2; i++){fork();printf("-");}return 0;
}

注意:输出8个-,而不是6个-

1.fork()系统调用是Unix下以自身进程创建子进程的系统调用,一次调用,两次返回,如果返回是0,则是子进程,如果返回值>0,则是父进程(返回值是子进程的pid),这是众为周知的。

2.还有一个很重要的东西是,在fork()的调用处,整个父进程空间会原模原样地复制到子进程中,包括指令,变量值,程序调用栈,环境变量,缓冲区,等等。

因为printf(“-”);语句有buffer,所以,对于上述程序,printf(“-”);把“-”放到了缓存中,并没有真正的输出。在fork的时候,缓存被复制到了子进程空间,所以,就多了两个,就成了8个,而不是6个。

Unix下的设备有“块设备”和“字符设备”的概念,所谓块设备,就是以一块一块的数据存取的设备,字符设备是一次存取一个字符的设备。磁盘、内存都是块设备,字符设备如键盘和串口。块设备一般都有缓存,而字符设备一般都没有缓存

对于上面的问题,我们如果修改一下上面的printf的那条语句为:
printf("-\n");

或是

printf("-");
fflush(stdout);

就没有问题了(就是6个“-”了),因为程序遇到“\n”,或是EOF,或是缓中区满,或是文件描述符关闭,或是主动flush,或是程序退出,就会把数据刷出缓冲区。需要注意的是,标准输出是行缓冲,所以遇到“\n”的时候会刷出缓冲区,但对于磁盘这个块设备来说,“\n”并不会引起缓冲区刷出的动作,那是全缓冲,你可以使用setvbuf来设置缓冲区大小,或是用fflush刷缓存。


参考:http://coolshell.cn/articles/7965.html


fflush用于清空缓冲流,虽然一般感觉不到,但是默认printf是缓冲输出的。
fflush(stdout),使stdout清空,就会立刻输出所有在缓冲区的内容。
fflush(stdout)这个例子可能不太明显,但对stdin很明显。
如下语句:
int a,c;
scanf("%d",&a);
getchar();
输入:
12(回车)
那么 a=12 ,c= '\n' 
而:
int a,c;
scanf("%d",&a);
fflush(stdin);
getchar();
输入:
12(回车)
那么a=12, c暂时未得到输入值,还需要再输入c,因为getchar也是缓冲输入,'\n'本还在缓冲区,但是被清空了。
另外fflush不能作用于重定向输入流。

5.linux驱动程序中字符设备和块设备的三点区别

1.字符设备只能以字节为最小单位访问,而块设备以块为单位访问,例如512字节,1024字节等

2.块设备可以随机访问,但是字符设备不可以

3.字符和块没有访问量大小的限制,块也可以以字节为单位来访问

参考:http://www.cnblogs.com/qlee/archive/2011/07/27/2118406.html



相关文章:

WCF优化的几个常规思路

前几天用WCF做项目时发现了一个效率问题&#xff0c;由于系统对效率要求较高&#xff0c;困扰了很长时间终于将问题解决了&#xff0c;写下来为以后的兄弟们参考&#xff0c;第一次写博客有不准确的地方还望同行们多喷多指点&#xff0c;先行谢过啦... 问题场景是这样的&#x…

使复选框选中_勾选复选框单元格变色,自动计数,在Excel中是如何实现的?

Excel中&#xff0c;我们经常会使用复选框来打勾打叉&#xff0c;这是复选框最基本的功能&#xff0c;相信很多小伙伴都会&#xff0c;但今天我跟大家分享的是复选框的其他操作技巧&#xff0c;勾选复选框变色&#xff0c;统计人数。下图中&#xff0c;我们要利用复选框是否打钩…

[短文速读] 重载有暗坑,JVM是如何执行方法的

前言 这将是一个系列文章。原因是自己写了很多文章&#xff0c;也看了很多文章。从最开始的仅仅充当学习笔记&#xff0c;到现在认认真真去写文章去分享。中间发现了很多事情&#xff0c;其中最大发现是&#xff1a;收藏不看&#xff01;总是想着先收藏以后有时间再看&#xff…

一笔画问题【数据结构-图论】

回家路上听到2个人在说&#xff1a;田字怎么一笔写成&#xff0c;并且笔划不重复。 田 我回家想了许久&#xff0c;觉得无论如何走正常的途径肯定是不行的&#xff0c;投机取巧脑筋急转弯的我不讨论。 那么是否可以找到数学定理&#xff1f; 其实就是欧拉七桥问题&#xff1a;1…

解析并符号 读取dll_Spring IOC容器之XmlBeanFactory启动流程分析和源码解析

一. 前言Spring容器主要分为两类BeanFactory和ApplicationContext,后者是基于前者的功能扩展&#xff0c;也就是一个基础容器和一个高级容器的区别。本篇就以BeanFactory基础容器接口的默认实现类XmlBeanFactory启动流程分析来入门Spring源码的学习。二. 概念要点1. 概念定义Be…

安装多个gcc

删除gcc #yum remove gcc 安装最新的 #yum install gcc 查找gcc源 可先通过“yum list compat-gcc*”查看版本&#xff0c;然后再利用“yum install compat-gccXXX”安装 #yum list compat-gcc* #sudo yum install compat-gcc-34.i686 查看gcc版本 #gcc -v #gcc34 -v参考&…

JAVA - HashMap和HashTable

1. HashMap 1) hashmap的数据结构 Hashmap本质就是一个数组&#xff0c;只是当key值重复时&#xff0c;使用链表的方式来存储重复的key值&#xff08;拉链法&#xff09;&#xff0c;注意&#xff1a;链表中存放的仍然是key值。如下图示&#xff1a; 当我们往hashmap中put元素…

empress和queen区别_queen与empress

(1)「queen」和「empress」不仅可以用来指称「king」和「emperor」的妻子&#xff0c;也能指代握有正式权力的女性君主。(2) 英国的君主(queen或king)之所以曾经有过empress或emperor的头衔&#xff0c;是因为英国曾统治过印度次大陆, 他们曾是印度的empress或emperor。如今&am…

在UIWindow上加类似于“回到顶部”的按钮

在公司上个版本的开发中遇到了一个UI布局的小问题&#xff1a; 某个页面需要增加一个分享按钮&#xff0c;但是该页面是二级页面&#xff0c;导航栏右边也已经放置了2个button。 起初和老大谈论这个问题的时候想到的方法是导航栏右边加三个button得了~但是一回想&#xff0c;这…

修改mysql 默认字符集 , 默认引擎

cd /var/lib/mysql/gamell vim db.optdefault-character-setutf8default-collationutf8_general_ciwq service mysqld restart或者service mysqld reload默认字符集修改完毕vim /etc/my.cnf[mysqld]datadir/var/lib/mysqlsocket/var/lib/mysql/mysql.sockusermysqldefault-stor…

bzoj2724: [Violet 6]蒲公英(分块)

传送门 md调了一个晚上最后发现竟然是空间开小了……明明算出来够的…… 讲真其实我以前不太瞧得起分块&#xff0c;觉得这种基于暴力的数据结构一点美感都没有。然而今天做了这道分块的题才发现分块的暴力之美&#xff08;如果我空间没有开小就更美了&#xff09; 我们先将整个…

Linux0.01内核根目录Makefile注释

# # Makefile for linux. # If you dont have -mstring-insns in your gcc (and nobody but me has :-) # remove them from the CFLAGS defines. ## #8086汇编编译器和连接器. -0生成8086目标程序;-a生成与gas和gld部分兼容的代码 # AS86 as -0 -a CC86 cc -0 LD86 ld -0# #G…

快速滚动_方老师教滚动快速作文

五年级第一单元作文集阴沉天空中有一小束照着你的阳光。亲爱的孩子&#xff0c;让时间在知识的枝条上、智慧的绿叶上、成熟的果实上留下它勤奋的印痕&#xff01;罗婉汀作文集自律且努力&#xff0c;别让生活太安逸。亲爱的孩子&#xff0c;耕耘者最信得过自己的汗水&#xff0…

liunx复制备份命令,copy命令,liunx命令

2019独角兽企业重金招聘Python工程师标准>>> 拷贝到的文件夹 /usr/local/文件夹/需要拷贝的路径文件夹 /usr/local/tomcat/webapps/文件夹/复制命令cp -r /usr/local/文件夹/ /usr/local/tomcat/webapps/文件夹/ 转载于:https://my.oschina.net/u/2336787/blog/635…

20.Valid Parentheses (python)

这道题主要用栈来实现的。什么是栈呢&#xff0c;参照书上的后缀表达式的例子谈谈自己的理解&#xff0c;栈最明显的特征是先进后出。所以可以有效的结合题目中 &#xff08;&#xff09;对匹配问题&#xff0c;可以把从列表中获取的符号先存到栈中。 首先建个空列表用于映射栈…

The HipHop Virtual Machine

目前Facebook已将该HipHop虚拟机开源&#xff0c;源代码发布在GitHub上。关于该工具的技术原理在Facebook的开发者页面上有一篇详细的文章介绍&#xff0c;查看这里。如果看不到的可以看下面的转载&#xff1a;Were always looking for ways to make our computing infrastruct…

node建立博客系统遇到的问题,1,乱码。2,multer的使用错误。3使用session问题...

2019独角兽企业重金招聘Python工程师标准>>> 1&#xff0c;乱码 文件存储为utf-8格式后还是报错。 原来这个设置只对新建文件编码有效&#xff0c;旧文件不处理的&#xff0c;我还以为旧文件也给转换了。 2&#xff0c;上传文件的multer模块使用错误。 throw new Ty…

python时间函数入门_calendar在python3时间中有哪些常用函数?怎么用?

想要在python中写代码游刃有余&#xff0c;没有函数的支持是万万不行的。很多小伙伴反映&#xff0c;最近函数的应用知识不够了&#xff0c;所以小编挑选了python3时间中的函数&#xff0c;希望可以帮助大家在处理日历方面更加的迅速。其他更多的函数&#xff0c;大家也可以自行…

9.spark core之共享变量

简介 spark执行操作时&#xff0c;可以使用驱动器程序Driver中定义的变量&#xff0c;但有时这种默认的使用方式却并不理想。 集群中运行的每个任务都会连接驱动器获取变量。如果获取的变量比较大&#xff0c;执行效率会非常低下。每个任务都会得到这些变量的一份新的副本&…

【CSDN2012年度博客之星】需要您的一票,感谢大家的支持

从2004年9月&#xff0c;本人一直将自己工作和学习经验写成博文分享给大家&#xff0c;本人有幸被选为&#xff12;&#xff10;&#xff11;&#xff12;年&#xff18;&#xff18;位候选博客之星&#xff0c;如果各位IT‘er喜欢我的博文&#xff0c;请投我一票&#xff0c;做…

双绞线和同轴电缆

线缆作为连接器件&#xff0c;相当于不同系统之间沟通的“桥梁”&#xff0c;选择线缆类型的好坏&#xff0c;也决定着传输信号的质量&#xff0c;影响着整个系统的稳定性。 &#xff08;1&#xff09;特性阻抗 先说一下关于线缆在传输过程中的特性阻抗问题。 特性阻抗是指电缆…

keras训练完以后怎么预测_使用Keras建立Wide Deep神经网络,通过描述预测葡萄酒价格...

你能通过“优雅的单宁香”、“成熟的黑醋栗香气”或“浓郁的酒香”这样的描述&#xff0c;预测葡萄酒的价格吗&#xff1f;事实证明&#xff0c;机器学习模型可以。在这篇文章中&#xff0c;我将解释我是如何利用Keras(tf.keras)建立一个Wide & Deep神经网络&#xff0c;并…

如何发布自己的NPM包(模块)?

1.注册NPM 账号 注册地址&#xff1a;https://www.npmjs.com/。 2.初始化自己要发布的项目 搭建本地环境&#xff1a;安装node.js&#xff0c;包含了npm命令。新建目录&#xff0c;在该目录下&#xff0c;初始化项目&#xff1a;npm init。按照提示填写初始化信息&#xff0c;我…

PHP对于浮点型的数据需要用不同的方法去解决

Php: BCMathbc是Binary Calculator的缩写。bc*函数的参数都是操作数加上一个可选的 [int scale]&#xff0c;比如string bcadd(string $left_operand, string $right_operand[, int $scale])&#xff0c;如果scale没有提供&#xff0c;就用bcscale的缺省值。这里大数直接用一个…

mysql提示符详解_MySQL字符集使用详解

查看字符集相关变量mysql> show variables like character%;————————–——————————-| Variable_name | Value |————————–——————————-| character_set_client | latin1 || character_set_connection | latin1 || character_set_database…

Apache漏洞修复

今天受同事的委托&#xff0c;修复一台服务器的Apache漏洞&#xff0c;主要集中在以下几点&#xff1a; 1.Apache httpd remote denial of service&#xff08;中危&#xff09; 修复建议&#xff1a;将Apache HTTP Sever升级到2.2.20或更高版本。 解决方法&#xff1a;升级HTT…

Java遍历Map对象的四种方式

关于java中遍历map具体哪四种方式&#xff0c;请看下文详解吧。 方式一 这是最常见的并且在大多数情况下也是最可取的遍历方式。在键值都需要时使用。 1 2 3 4 Map<Integer, Integer> map new HashMap<Integer, Integer>(); for (Map.Entry<Integer, Intege…

Tokyo Cabinet 安装

tokyocabinet :一个key-value的DBM数据库&#xff0c;但是没有提供网络接口&#xff0c;以下称TC。 tokyotyrant :是为TC写的网络接口&#xff0c;他支持memcache协议&#xff0c;也可以通过HTTP操作&#xff0c;以下称TT。 Tokyo Cabinet 是一款 DBM 数据库&#xff0c;Tokyo …

Packagist / Composer 中国全量镜像

Packagist 镜像 请各位使用本镜像的同学注意&#xff1a; 本镜像已经依照 composer 官方的数据源安全策略完全升级并支持 https 协议&#xff01;请各位同学 按照下面所示的两个方法将 http://packagist.phpcomposer.com 修改为 https://packagist.phpcomposer.com 还没安装 co…

centos yum mysql-devel 5.5_CentOS 6.5下yum安装 MySQL-5.5全过程图文教程

在linux安装mysql是一个困难的事情&#xff0c;yum安装一般是安装的mysql5.1&#xff0c;现在经过自己不懈努力终于能用yum安装mysql5.5了。下面通过两种方法给大家介绍CentOS 6.5下yum安装 MySQL-5.5全过程&#xff0c;一起学习吧。方法一&#xff1a;具体方法和步骤如下所示&…