`
brxonline
  • 浏览: 64277 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

UNIX编程(1)-基础知识

    博客分类:
  • C
阅读更多
1.登陆名
登陆名放在/etc/passwd口令文件中,口令文件中的登陆项由7个以冒号分隔的字段组成,他们是:登陆名,加密口令,用户ID,用户组ID,注释字段,起始目录,shell程序
daemon:x:2:2:daemon:/sbin:/sbin/nologin
2.文件和目录
例:列出目录中所有的文件
#include "apue.h"
#include <dirent.h>

int
main(int argc, char *argv[])
{
	DIR				*dp;
	struct dirent	*dirp;

	if (argc != 2)
		err_quit("usage: ls directory_name");

	if ((dp = opendir(argv[1])) == NULL)
		err_sys("can't open %s", argv[1]);
	while ((dirp = readdir(dp)) != NULL)
		printf("%s\n", dirp->d_name);

	closedir(dp);
	exit(0);
}

3.输入和输出
   1)文件描述符
      通常是一个小的非负整数,内核用它标识一个特定进程正在访问的文件。每当运行一个新的程序时,所有的shell都为其打开三个文件描述符:标准输入,标准输出,标准出错
    2)不用缓冲的IO
    例:将标准输入复制到标准输出
#include "apue.h"

#define	BUFFSIZE	4096

int
main(void)
{
	int		n;
	char	buf[BUFFSIZE];

	while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)
		if (write(STDOUT_FILENO, buf, n) != n)
			err_sys("write error");

	if (n < 0)
		err_sys("read error");

	exit(0);
}

   3)标准IO
   标准IO函数提供一种对不用缓冲IO函数的带缓冲的借口
    例:用标准IO将标准输入复制到标准输出
#include "apue.h"

int
main(void)
{
	int		c;

	while ((c = getc(stdin)) != EOF)
		if (putc(c, stdout) == EOF)
			err_sys("output error");

	if (ferror(stdin))
		err_sys("input error");

	exit(0);
}


4.进程和线程
UNIX系统确保每个进程都有一个唯一的数字标识符,称为进程ID
例:打印进程ID
#include "apue.h"

int
main(void)
{
	printf("hello world from process ID %d\n", getpid());
	exit(0);
}

有三个用于进程控制的主要函数:fork,exec, waitpid
例:从标准输入读命令并执行
 #include "apue.h"
#include <sys/wait.h>

int
main(void)
{
	char	buf[MAXLINE];	/* from apue.h */
	pid_t	pid;
	int		status;

	printf("%% ");	/* print prompt (printf requires %% to print %) */
	while (fgets(buf, MAXLINE, stdin) != NULL) {
		if (buf[strlen(buf) - 1] == '\n')
			buf[strlen(buf) - 1] = 0; /* replace newline with null */

		if ((pid = fork()) < 0) {
			err_sys("fork error");
		} else if (pid == 0) {		/* child */
			execlp(buf, buf, (char *)0);
			err_ret("couldn't execute: %s", buf);
			exit(127);
		}

		/* parent */
		if ((pid = waitpid(pid, &status, 0)) < 0)
			err_sys("waitpid error");
		printf("%% ");
	}
	exit(0);
}

通常一个进程只有一个控制线程,在同一进程里的所有线程共享同一地址空间,文件描述符,栈以及与进程相关的属性。

5.出错处理
   当UNIX函数出错时,常返回一个负值,而且整形变量errno通常被设置为含有附加信息的一个值。
有两个函数帮助打印出错信息:
1)将errno映射为出错信息字符串
#include <string.h>
char *strerror(int errnum);
2)基于当前errno值,在标准出错上产生一条出错信息,它首先输出由msg指向的字符串,然后是一个冒号,一个空格,接着是对应于errno值的出错信息,最后是一个换行符
#include <stdio.h>
void perror(const char *msg);
例:strerror和perror的用法
#include "apue.h"
#include <errno.h>

int
main(int argc, char *argv[])
{
	fprintf(stderr, "EACCES: %s\n", strerror(EACCES));
	errno = ENOENT;
	perror(argv[0]);
	exit(0);
}

6.用户标识
用户标识有用户ID,组ID,附加组ID
例:打印用户ID和组ID
#include "apue.h"

int
main(void)
{
	printf("uid = %d, gid = %d\n", getuid(), getgid());
	exit(0);
}

7.信号
信号是通知进程已发生某种情况的一种技术,进程如何处理信号有三种选择
1)忽略该信号
2)按系统默认的方式处理
3)提供一个函数处理
例:从标准输入读命令并执行
#include "apue.h"
#include <sys/wait.h>

static void	sig_int(int);		/* our signal-catching function */

int
main(void)
{
	char	buf[MAXLINE];	/* from apue.h */
	pid_t	pid;
	int		status;

	if (signal(SIGINT, sig_int) == SIG_ERR)
		err_sys("signal error");

	printf("%% ");	/* print prompt (printf requires %% to print %) */
	while (fgets(buf, MAXLINE, stdin) != NULL) {
		if (buf[strlen(buf) - 1] == '\n')
			buf[strlen(buf) - 1] = 0; /* replace newline with null */

		if ((pid = fork()) < 0) {
			err_sys("fork error");
		} else if (pid == 0) {		/* child */
			execlp(buf, buf, (char *)0);
			err_ret("couldn't execute: %s", buf);
			exit(127);
		}

		/* parent */
		if ((pid = waitpid(pid, &status, 0)) < 0)
			err_sys("waitpid error");
		printf("%% ");
	}
	exit(0);
}

void
sig_int(int signo)
{
	printf("interrupt\n%% ");
}



8.时间值
UNIX使用两种时间:
日历时间,从1970-01-01 00:00:00所经的秒数累计值,以time_t保存这种值。
进程时间,也称为CPU时间,用以度量进程使用的CPU资源,用clock_t保存这种值,UNIX系统使用三个进程时间值:时钟时间,用户CPU时间,系统CPU时间
9.系统调用和库函数
UNIX提供定义明确,数量有限,可直接进入内核的入口点,这些入口点称为系统调用。库函数并不是内核的入口点。UNIX为每个系统调用在标准C库中设置一个具有同样名字的函数。
分享到:
评论

相关推荐

    UNIX编程哲学-中文版

    - **哲学核心**:《UNIX编程哲学》一书深入探讨了UNIX系统背后的深层次思考,强调了一种独特的文化、艺术和设计哲学,这些元素共同构成了UNIX的核心价值。作者Henry Spencer在Usenet上的签名:“不懂Unix的人注定...

    UNIX编程艺术 - 扫描版 - 书签

    根据提供的信息,我们可以了解到这是一本关于《UNIX编程艺术》的经典书籍,...通过学习本书中的知识点,读者不仅能够掌握UNIX编程的基础知识,还能了解到更多高级技术和实践经验,为日后的软件开发工作打下坚实的基础。

    unix环境高级编程--第章 UNIX基础知识.doc

    《UNIX环境高级编程》第一章主要介绍了UNIX操作系统的基础知识,包括登录、文件和目录等方面的知识。 1. **登录(Logging ln)** - **登录名**:登录到UNIX系统时,需要输入登录名和口令。登录名在系统口令文件...

    Unix技术--基础篇.rar

    这个名为"Unix技术--基础篇.rar"的压缩包文件很显然是为了帮助初学者或对Unix感兴趣的用户了解Unix的基础知识。下面,我们将深入探讨Unix系统的核心概念、基本操作以及其重要性。 Unix系统是由贝尔实验室的一组...

    UNIX环境高级编程-pdf

    首先,书中涵盖了UNIX系统的基础知识,包括进程管理、文件系统、I/O操作和信号处理等核心概念。对于进程管理,它详细阐述了如何创建和控制进程,包括fork、exec和wait系列函数的使用,以及进程间的通信机制如管道、...

    UNIX----系统编程

    - **POSIX标准**:提供了跨平台的UNIX编程接口,如pthread库用于线程编程。 通过深入学习和实践以上知识点,你将能够熟练地进行UNIX系统编程,开发出高效、稳定的应用程序。记得结合《UNIX系统编程》这样的参考...

    UNIX网络编程第1卷(1-19章)

    《UNIX网络编程》第一卷主要涵盖了网络编程的基本概念、传输层...总体来说,《UNIX网络编程》第一卷不仅为读者提供了网络编程的基础知识和实践指南,还引入了最新的网络技术和标准,使其成为网络编程领域的宝贵资源。

    unix网络编程--第一卷----套接口API

    《UNIX网络编程——第一卷——套接口API》是网络编程领域的经典之作,尤其在UNIX操作系统环境下,这本书被视为不可或缺的学习资源。作者深入浅出地讲解了网络通信的基础理论和实际操作,帮助开发者理解如何利用套...

    Unix编程艺术/Unix环境高级编程(第二版)/Unix网络编程(第二版)

    《Unix编程艺术》、《Unix环境高级编程(第二版)》和《Unix网络编程(第二版)》是三本在IT领域中具有深远影响力的经典著作,涵盖了Unix操作系统的核心概念、系统调用、进程管理、文件操作、网络通信等多个重要主题...

    Unix基础知识与Shell编程

    ### Unix基础知识与Shell编程 #### 1. Unix环境介绍 Unix是一种多用户、多任务的操作系统,被广泛应用于服务器、超级计算机和个人电脑中。它以其稳定性、安全性、灵活性著称,成为了开发人员和系统管理员的理想...

    Linux/UNIX网络编程》-甘刚-电子教案

    1. **套接字接口**:这是Linux和UNIX系统中进行网络编程的基础,包括socket()函数创建套接字,bind()将套接字与本地地址关联,listen()设置服务器监听模式,accept()接收连接请求,connect()客户端连接服务器,以及...

    Unix编程艺术中文版(非加密,带目录)

    ### Unix编程基础知识 1. **命令行界面**:Unix的核心特性之一是其强大的命令行界面。通过命令行,用户可以直接与操作系统交互,执行各种操作。学习Unix编程的第一步就是熟悉常用的命令及其用法。 2. **Shell脚本...

    unix环境高级编程----------------------------------

    9. **标准库与C语言接口**:Unix标准库如`stdio.h`, `stdlib.h`, `string.h`, `unistd.h`等提供了大量的函数,是C语言编程的基础。 10. **Shell脚本编程**:Unix shell不仅是一个命令解释器,还是编写自动化任务的...

    UNIX环境高级编程+UNIX网络编程卷1.PDF版

    1. **网络基础知识**:介绍TCP/IP协议族的基本概念,包括IP、ICMP、TCP、UDP等协议的作用和工作原理。 2. **套接字编程**:讲解socket API的使用,包括创建套接字、绑定、监听、连接和数据收发等操作,以及套接字...

    UNIX网络编程卷1代码.rar

    Richard Stevens撰写,主要涵盖了套接字编程和网络通信的基础知识。这个压缩包包含的代码是书中的示例程序,对于学习和理解UNIX系统下的网络编程非常有帮助。下面我们将详细探讨这些知识点。 1. 套接字(Socket)...

    shell编程和UNIX命令1-10

    在IT领域,Shell编程和UNIX命令是不可或缺的基础技能,尤其对于系统管理员、开发者以及...这个名为“shell编程和UNIX命令1-10”的压缩包可能包含一系列教程或练习,建议按照顺序逐一学习,通过实际操作来巩固理论知识。

    LINUX与UNIX SHELL编程指南--part1

    《LINUX与UNIX SHELL编程指南--part1》是一本深度解析Linux和Shell编程的教程,涵盖了从基础到进阶的广泛内容。本部分包含了前17章的学习资料,为读者提供了一个全面的起点,深入理解这两种操作系统的核心编程概念。...

    UNIX实验---考勤程序--shell编程

    首先,我们需要了解Shell的基础知识。在UNIX和类UNIX系统中,Shell是用户与操作系统内核交互的界面。常见的Shell有Bash(Bourne-Again SHell)、Sh、Csh和Zsh等。Bash是最常用的一种,它扩展了Sh的功能,且大多数...

    UNIX环境高级编程-源代码

    本书全面介绍了UNIX系统的程序设计界面—... 本书内容丰富权威,概念清晰精辟,一直以来被誉为UNIX编程的“圣经”,对于所有UNIX程序员—无论是初学者还是专家级人士—都是一本无价的参考书籍。 压缩包中是源代码。

Global site tag (gtag.js) - Google Analytics