1.unix基础知识
1)unix体系结构
2)shell->bash(所有的linux都支持),sh, csh, ksh, tcsh
3)unix文件系统是目录和文件的层次结构,文件系统的起点是根目录("/")。
文件名的命名,不能包含斜线和空字符。最好只包含字母数字下划线。
绝对路径,相对路径,工作路径(进程文件名所在的目录),起始目录(口令文件中记载的)。
实例,ls命令的简单实现。
/*************************************************************************
> File Name: a.c
> Author: aben
> Created Time: Sat 17 Mar 2018 10:10:45 PM PDT
************************************************************************/
#include<stdio.h>
#include<dirent.h>
int main(int argc, char* argv[])
{
DIR *dir;
struct dirent *dirp;
if (argc != 2) {
printf("useage:dirname \n");
}
if ((dir = opendir(argv[1])) == NULL) {
printf("useage:dirname \n");
}
while ((dirp = readdir(dir)) != NULL) {
printf("%s \n", dirp->d_name);
}
closedir(dir);
return 0;
}
4)时间值
日历时间。
进程时间 (时钟时间,用户cpu时间,系统cpu时间),可通过time命令获得。
2.unix编程标准发展
1)目前世界上大概分为三种标准。如下,
1. ISOC,International Origianization Standards C;
2. POSIX, Portable Operating Syatem Interface;
3. FIPS, 美国政府的一个标准;
posix包含isoc, single uinx specification包含posix。
2)常用的标准实现。
FreeBSD操作系统; Linux操作系统;Mac OS操作系统;Solaris操作系统;
这4种操作系统都提供uinx编程环境,基本符合posix编程标准,但是只有mac os和solaris称得上是unix操作系统。
3)限制
例如一个进程能同时打开的标准IO流数目,文件名的最大长度等等。
限制分为编译时限制和运行时限制,编译时限制为常量,运行时限制依赖于操作系统的运行状态,可有sysconf,pathconf,fpathconf等api获得。返回值为正数则为限制值,返回0表示不确定,返回-1表示参数错误。所以下方例子是不完美的例子。
/*************************************************************************
> File Name: b.c
> Author: aben
> Created Time: Sat 17 Mar 2018 11:54:12 PM PDT
************************************************************************/
#include<stdio.h>
#include<unistd.h>
int main()
{
//sysconf运用实例
printf("exec函数的参数最大长度:%ld\n", sysconf(_SC_ARG_MAX));
printf("每个实际用户的最大进程数:%ld \n", sysconf(_SC_CHILD_MAX));
printf("每个进程最大打开文件数:%ld \n", sysconf(_SC_OPEN_MAX));
//pathconf运用实例
printf("相对路径名的最大字节数:%ld \n", pathconf("./", _PC_PATH_MAX));
return 0;
}
4)posix标准标准可选的接口和必选的接口。
那么我们编程依赖的操作系统是否实现了这些接口呢?同样可以由 sysconf,pathconf,fpathconf等api获得。使用方法参考上方例子。
5)功能测试宏
用于符号排他性定义。例如_POSIX_C_SOURCE,一旦定义了此常量,所有的的posix头文件都可以使用此常量来排除任何实现专有的定义。
5)基本数据类型
全部以_t结尾,这些类型全是基本数据类型,但是为了程序的可移植性,通过typedef重定义以方便编程时无需考虑系统的变化。