第 7 章进程控制开发

本章目标
文件是 Linux 中最常见最基础的操作对象,而进程则是系统调度的单位,在上一章学习了文件I/O 控制之后,本章主要讲解进程控制开发部分,通过本章的学习,读者将会掌握以下内容。
  • 掌握进程相关的基本概念
  • 掌握 Linux 下的进程结构
  • 掌握 Linux 下进程创建及进程管理
  • 掌握 Linux下进程创建相关的系统调用
  • 掌握守护进程的概念
  • 掌握守护进程的启动方法
  • 掌握守护进程的输出及建立方法
  • 学会编写多进程程序
  • 学会编写守护进程
7.1 Linux 下进程概述
7.1.1 进程相关基本概念
1.进程的定义 Continue reading

6.5.3 输入输出

文件打开之后,根据一次读写文件中字符的数目可分为字符输入输出、行输入输出和格式化输入输出,下面分别对这3 种不同的方式进行讨论。
1.字符输入输出
字符输入输出函数一次仅读写一个字符。其中字符输入输出函数如表6.20和表6.21所示。
表6.20 字符输出函数语法要点
所需头文件#include <stdio.h>
函数原型
int getc(FILE * stream)
int fgetc(FILE * stream)
int getchar(void)
函数传入值stream:要输入的文件流
函数返回值 Continue reading

6.5.2 文件读写

1.读文件
(1)fread函数说明
在文件流打开之后,可对文件流进行读写等操作,其中读操作的函数为fread。
(2)fread函数格式
fread函数格式如表6.18所示。
表6.18 fread函数语法要点
所需头文件 #include <stdio.h>
函数原型 size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)
ptr:存放读入记录的缓冲区
size:读取的记录大小
nmemb:读取的记录数
函数传入值
stream:要读取的文件流
函数返回值
成功:返回实际读取到的nmemb数目
失败:EOF
2.写文件
(1)fwrite函数说明
fwrite函数是用于对指定的文件流进行写操作。
(2)fwrite函数格式
fwrite函数格式如表6.19 所示。
表6.19 fwrite函数语法要点
所需头文件#include <stdio.h>
函数原型 size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream)
函数传入值ptr:存放写入记录的缓冲区
size:写入的记录大小
nmemb:写入的记录数
stream:要写入的文件流
函数返回值
成功:返回实际写入到的nmemb数目
失败:EOF
这里仅以fwrite为例简单说明:
#include <stdio.h>
int main()
{
FILE *fp;
char s[3] = {'a','b','c'};
int i,nmemb = sizeof(s);
printf("%d\n", nmemb);
fp = fopen("what", "w");
i = fwrite(s, sizeof(char), nmemb, fp);
printf("i=%d\n", i);
fclose(fp);
}
运行结果如下所示:
[root@localhost file]# ./write
i=3
[root@localhost file]# cat what
abc

6.5 标准 I/O 开发

本章前面几节所述的文件及I/O 读写都是基于文件描述符的。这些都是基本的I/O 控制,是不带缓存的。而本节所要讨论的I/O 操作都是基于流缓冲的,它是符合ANSI C的标准I/O处理,这里有很多函数读者已经非常熟悉了(如printf、scantf 函数等),因此本节中仅简要介绍最主要的函数。

标准 I/O 提供流缓冲的目的是尽可能减少使用read和write调用的数量。标准I/O 提供了3 种类型的缓冲存储。

· 全缓冲。在这种情况下,当填满标准I/O 缓存后才进行实际I/O 操作。对于驻在磁盘上的文件通常是由标准I/O 库实施全缓冲的。在一个流上执行第一次I/O 操作时,通常调用malloc就是使用全缓冲。

· 行缓冲。在这种情况下,当在输入和输出中遇到新行符时,标准I/O 库执行I/O 操作。
这允许我们一次输出一个字符(如fputc 函数),但只有写了一行之后才进行实际I/O 操作。
当流涉及一个终端时(例如标准输入和标准输出),典型地使用行缓冲。 Continue reading

6.3.3 fcntl函数说明

(1)fcntl函数说明
前面的这5个基本函数实现了文件的打开、读写等基本操作,这一节将讨论的是,在文 件已经共享的情况下如何操作,也就是当多个用户共同使用、操作一个文件的情况,这时,Linux 通常采用的方法是给文件上锁,来避免共享的资源产生竞争的状态。
文件锁包括建议性锁强制性锁
建议性锁要求每个上锁文件的进程都要检查是否有锁存,并且尊重已有的锁。在一般情况下,内核和系统都不使用建议性锁。强制性锁是由内 核执行的锁,当一个文件被上锁进行写入操作的时候,内核将阻止其他任何文件对其进行读写操作。采用强制性锁对性能的影响很大,每次读写操作都必须检查是否有锁存在。
在 Linux 中,实现文件上锁的函数有lock和fcntl,其中flock用于对文件施加建议性锁,而fcntl不仅可以施加建议性锁,还可以施加强制锁。同时,fcntl还能对文件的某一记录进行上锁,也就是记录锁。
记录锁又可分为读取锁写入锁,其中读取锁又称为共享锁,它能够使多个进程都能在文件的同一部分建立读取锁。而写入锁又称为排斥锁,在任何时刻只能有一个进程在文件的某个部分上建立写入锁。当然,在文件的同一部分不能同时建立读取锁和写入锁。
注意:
fcntl是一个非常通用的函数,它还可以改变文件进程各方面的属性,在本节中,主要介绍它建立记录锁的方法,关于它其他用户感兴趣的读者可以参看fcntl手册。 Continue reading

6.3 不带缓存的文件I/O 操作

本节主要介绍不带缓存的文件I/O 操作,主要用到5 个函数:open、read、write、lseek和close。这里的不带缓存是指每一个函数都只调用系统中的一个函数。这些函数虽然不是ANSI C的组成部分,但是是POSIX 的组成部分。

6.3.1 open和close

(1)open和close函数说明

open函数是用于打开或创建文件,在打开或创建文件时可以指定文件的属性及用户的权限等各种参数。

close函数是用于关闭一个打开文件。当一个进程终止时,它所有已打开的文件都由内核自动关闭,很多程序都使用这一功能而不显示地关闭一个文件。

(2)open和close函数格式

open函数的语法格式如表6.1 所示。

表6.1 open函数语法要点

所需头文件

#include <sys/types.h> // 提供类型pid_t的定义

#include <sys/stat.h>

#include <fcntl.h>

续表 Continue reading

6.2 Linux 中文件及文件描述符概述

正如第1 章中所述,在Linux 中对目录和设备的操作都等同于文件的操作,因此,大大简化了系统对不同设备的处理,提高了效率。Linux 中的文件主要分为4 种:普通文件、目录文件、链接文件和设备文件。
那么,内核如何区分和引用特定的文件呢?这里用到的就是一个重要的概念——文件描述符。对于Linux 而言,所有对设备和文件的操作都使用文件描述符来进行的。文件描述符是一个非负的整数,它是一个索引值,并指向内核中每个进程打开文件的记录表。当打开一个现存文件或创建一个新文件时,内核就向进程返回一个文件描述符;当需要读写文件时,也需要把文件描述符作为参数传递给相应的函数。
通常,一个进程启动时,都会打开3 个文件:标准输入、标准输出和标准出错处理。这3 个文件分别对应文件描述符为0、1 和2(也就是宏替换STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO,鼓励读者使用这些宏替换)。
基于文件描述符的I/O 操作虽然不能移植到类Linux 以外的系统上去(如Windows),但它往往是实现某些I/O操作的惟一途径,如Linux中低级文件操作函数、多路I/O、TCP/IP套接字编程接口等。同时,它们也很好地兼容POSIX标准,因此,可以很方便地移植到任何POSIX平台上。基于文件描述符的I/O操作是Linux中最常用的操作之一,希望读者能够很好地掌握。

用PHP命令行控制脚本[CLI]

CLI    :Command-Line Script(CLI - Command-Line Interface) //翻译;命令行接口

字串5

PHP CLI(Command Line Interface). http://www.php.net/ 预设支援CLI 了,什么是CLI,也就是Command Line Interface,简单的说,就是让你可以在系统上当shell 来跑。 如果还不懂,简单的说,就像你写perl 程式一样:
#!/usr/local/bin/php
echo "Hello World!";
?>

字串3
---------------------------------------------------------官方[PHP 手册]叙述:

从版本 4.3.0 开始,PHP 提供了一种新类型的 SAPI(Server Application Programming Interface,服务端应用编程端口)支持,名为 CLI,意为 Command Line Interface,即命令行接口。顾名思义,该 SAPI 模块主要用作 PHP 的开发外壳应用。CLI SAPI 和其它 SAPI 模块相比有很多的不同之处,我们将在本章中详细阐述。值得一提的是,CLI 和 CGI 是不同的 SAPI,尽管它们之间有很多共同的行为。 Continue reading

asp实现QQ号状态和QQ秀

原理基于Xmlhttp查询http://webpresence.qq.com/getonline?qq=QQ

如果在线将返回1为在线,0为不在线。 好了,

或者:

1) 定义online数组,必须是online命名

<script>var online= new Array();</script>

2) 获取在线状态

<script src="http://webpresence.qq.com/getonline?Type=1&271569542:"></script>

可以获取多个,必须以冒号分隔,以冒号结尾,比如:

<script src="http://webpresence.qq.com/getonline?Type=1&271569542:78293657:123456:"></script>

online[0]=0,表示271569542离线

online[1]=1,表示78293657在线

online[2]=1,表示123456在线

填写号码的先后顺序,分别对应数组online的0、1、2

QQ秀怎么返回那

这个地址http://qqshow-user.tencent.com/

是显示QQ秀的 Continue reading

nginx和apache下对域名进行301重定向-优化篇

一般网站为了将网站的权重从yoursite.com自动转向到www.yoursite.com,这里我们在nginx下来实现永久跳转.

将不带WWW的主域名重定向到带WWW的二级域名,实现两个域名合并,方法如下:

Nginx配置方法:

方法1:

server {

server_name www.yoursite.com yoursite.com;

if ($host != 'www.yoursite.com' ) {

rewrite  ^/(.*)$  http://www.yoursite.com/$1  permanent;

}

...

}

Continue reading