导航:首页 > 编程系统 > linuxbread

linuxbread

发布时间:2023-05-28 05:31:09

A. c 获取串口号 c 自动获取串口号

用C怎么写获取串口的内容

看驱动程序的接口啊

一般是是open(“口名”)

用C/C++写一扒游个小程序读取串口接收到贺此销的数据

你太幸运了,刚好我有一个,你在禅游vc++6.0下测试一下。

/* serrecv.c */

/* Receives and saves a file over a serial port */

/* Last modified: Septemeber 21, 2005 */

/* [goman89] */

#include

#include

#include

/* Function to print out usage information */

void usage(void);

/* Function to set up the serial port settings with the specified baud rate,

no parity, and one stop bit */

void set_up_serial_port(HANDLE h, long baud);

/* Function to receive and save file from serial port */

void get_file_from_serial_port(HANDLE h, char *file_name, unsigned long file_length);

int main(int argc, char **argv)

{

HANDLE serial_port; /* Handle to the serial port */

long baud_rate = 9600; /* Baud rate */

char port_name[] = "COM1:"; /* Name of serial port */

unsigned long file_size; /* Size of file to receive in bytes */

unsigned long bytes_received; /* Bytes received from serial port */

unsigned long file_name_size; /* Size of file name in bytes */

char file_name[256]; /* Name of file to receive */

/* Check mand line */

if (argc == 3)

{

/* Read in baud rate */

if (argv[1][1] != 'b' || sscanf(argv[2], "%ld", &baud_rate) != 1)

{

usage;

exit(0);

}

}

else if (argc != 1)

{

usage;

exit(0);

}

/* Open up a handle to the serial port */

serial_port = CreateFile(port_name, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);

/* Make sure port was opened */

if (serial_port == INVALID_HANDLE_VALUE)

{

fprintf(stderr, "Error opening port ");

CloseHandle(serial_port);

exit(0);

}

/* Set up the serial port */

set_up_serial_port(serial_port, baud_rate);

/* Receive file name size from serial port */

ReadFile(serial_port, (void *)&file_name_size, sizeof(unsigned long), &bytes_received, NULL);

if (bytes_received != sizeof(unsigned long))

{

fprintf(stderr, "Error getting file name size. ");

CloseHandle(serial_port);

exit(0);

}

/* Receive file name from serial port */

ReadFile(serial_port, (void *)file_name, file_name_size, &bytes_received, NULL);

if (bytes_received != file_name_size)

{

fprintf(stderr, "Error retrieving file name. ");

CloseHandle(serial_port);

exit(0);

}

/* Append NULL terminator to end of string */

file_name[bytes_received] = ''

/* Receive file size from serial port */

ReadFile(serial_port, (void *)&file_size, sizeof(unsigned long), &bytes_received, NULL);

if (bytes_received != sizeof(unsigned long))

{

fprintf(stderr, "Error getting file size. ");

CloseHandle(serial_port);

exit(0);

}

/* Get the file from the serial port */

get_file_from_serial_port(serial_port, file_name, file_size);

/* Print out success information */

printf(" %lu bytes successfully received and saved as %s ", file_size, file_name);

/* Close handle */

CloseHandle(serial_port);

return 0;

}

void usage(void)

{

fprintf(stderr, "Usage: ");

fprintf(stderr, " serrecv [-b baud rate] ");

fprintf(stderr, " Default baud rate is 9600 ");

fprintf(stderr, "tSupported baud rates: 1200, 2400, 4800, 9600, 14400, 19200 ");

return;

}

void set_up_serial_port(HANDLE h, long baud)

{

DCB properties; /* Properties of serial port */

/* Get the properties */

GetmState(h, &properties);

/* Set the baud rate */

switch(baud)

{

case 1200:

properties.BaudRate = CBR_1200;

break;

case 2400:

properties.BaudRate = CBR_2400;

break;

case 4800:

properties.BaudRate = CBR_4800;

break;

case 9600:

properties.BaudRate = CBR_9600;

break;

case 14400:

properties.BaudRate = CBR_14400;

break;

case 19200:

properties.BaudRate = CBR_19200;

break;

case 38400:

properties.BaudRate = CBR_38400;

break;

default:

fprintf(stderr, "Invalid baud rate: %ld ", baud);

usage;

exit(0);

break;

}

/* Set the other properties */

properties.Parity = NOPARITY;

properties.ByteSize = 8;

properties.StopBits = ONESTOPBIT;

SetmState(h, &properties);

return;

}

void get_file_from_serial_port(HANDLE h, char *file_name, unsigned long file_length)

{

FILE *data_file; /* File to create */

unsigned long bytes_left = file_length; /* Bytes left to receive */

unsigned long bytes_received_total = 0; /* Total bytes received */

unsigned long bytes_to_receive; /* Number of bytes to receive */

unsigned long bytes_received; /* Number of bytes receive */

char buffer[200]; /* Buffer to store data */

/* Open the file */

data_file = fopen(file_name, "wb");

/* Quit if file couldn't be opened */

if (data_file == NULL)

{

fprintf(stderr, "Could not create file %s ", file_name);

CloseHandle(h);

exit(0);

}

while (1)

{

/* Determine how many bytes to read */

if (bytes_left == 0)

{

break;

}

else if (bytes_left < 200)

{

bytes_to_receive = bytes_left;

}

else

{

bytes_to_receive = 200;

}

/* Receive data over serial cable */

ReadFile(h, (void *)buffer, bytes_to_receive, &bytes_received, NULL);

if (bytes_received != bytes_to_receive)

{

fprintf(stderr, "Error reading file. ");

CloseHandle(h);

exit(0);

}

/* Save buffer to file */

fwrite((void *)buffer, 1, bytes_received, data_file);

/* Decrement number of bytes left */

bytes_left -= bytes_received;

/* Increment number of bytes received */

bytes_received_total += bytes_received;

/* Print out progress */

printf(" %5lu bytes received.", bytes_received_total);

}

fclose(data_file);

return;

}

C语言变成实现串口收发数据

#include

#include

intmain(void)

{

FILE*fp;

chartemp;

charbuf[100];

if((fp=fopen("3","r"))==NULL)

puts("thiswaydoesn'twork! ");

else

puts("thiswayworks! ");

while(1)

{

temp=0;

fscanf(fp,"%c",&temp);

if(temp!=0)

putchar(temp);

else

Sleep(100);

}

fclose(fp);

return0;

}

以前弄的,好久没看了,不知到对不对。

还有下面这段:

#include

#include

HANDLEh;

intmain(void)

{

h=CreateFile(TEXT("COM3"),//COM1口

GENERIC_READ|GENERIC_WRITE,//允许读和写

0,//独方式

NULL,

OPEN_EXISTING,//打开而不是创建

0,//同步方式

NULL);

if(h==(HANDLE)-1)

{

printf("打开COM失败! ");

returnFALSE;

}

else

{

printf("COM打开成功! ");

}

Setupm(h,1024,1024);//输入缓冲区和输出缓冲区大小都是1024

COMMTIMEOUTSTimeOuts;

//设读超时

TimeOuts.ReadIntervalTimeout=1000;

TimeOuts.ReadTotalTimeoutMultiplier=500;

TimeOuts.ReadTotalTimeoutConstant=5000;

//设定写超时

TimeOuts.WriteTotalTimeoutMultiplier=500;

TimeOuts.WriteTotalTimeoutConstant=2000;

SetmTimeouts(h,&TimeOuts);//设置超时

DCBdcb;

GetmState(h,&dcb);

dcb.BaudRate=9600;//波特率为9600

dcb.ByteSize=8;//每个字节有8位

dcb.Parity=NOPARITY;//无奇偶校验位

dcb.StopBits=ONE5STOPBITS;//两个停止位

SetmState(h,&dcb);

DwordwCount;//读取的节数

BOOLbReadStat;

while(1)

{

Purgem(h,PURGE_TXCLEAR|PURGE_RXCLEAR);//清缓冲区

charstr[9]={0};

printf("%s ",str);

bReadStat=ReadFile(h,str,9,&wCount,NULL);

if(!bReadStat)

{

printf("

怎么通过串口读取51单片机某个地址的数据?请用C语言写出来。

*

授人以鱼,不如授人以渔

*

首先,你要明确在C语中读取内存址是基于指针。

3.比如读取内存地址0x22中的数据

C语言中对于内存的访是基于指,这个毋庸置疑,具体操如下

unsigned int *p= (unsigned int*)0x22 ;//定义针,并且使指针指向了0x22这个 内存地址;

那么*p就是最终你要读取的数据了。

4.至于如何通过串口显示到电脑我就不多了(这不是难点),据你都知道了,写到串口 缓冲区,在串口调试助手下就可以看到。

5.虽然没有贴出具体代码,但这里面的思想可以让你解决

标签:作文经典 上一篇:描写毛毛虫的词语 描写毛毛虫行动的词语 下一篇:成语误用褒贬的例子 褒贬误用的成语

linux下如何使用c/c++实现检测新增串口,并读取串口号

Linux下面有设文件

串口装好驱动后 会显示在dev下

然后对这个

C语言中如何对串口进行操作

C语言会有操作串口的库函数的,按照串口库数标识实现调

电脑上的串口号是什么意思

串口叫做串行接口,也串行通信接口,按电气标准及协议来分包括RS-232-C、RS-422、RS485、USB等。 RS-232-C、RS-422与RS-485标准对接口的电气特性做出规定,不涉及接插件、电缆或协议。USB是近几年发展起来的新型接口标准,主要应用于速数据传输域。 RS-232-C:也称标准串口,是目前最常用的一种串行通讯接口。它是在1970年由美国电子工业协会(EIA)联合贝尔系统、 调制解调器厂家及计算机终端生产厂共同制定的用于串行通讯的标 准。它的名是“数据终端设备(DTE)和数据通讯设备(DCE)之间 行二进制数据交换接口技术标准”。传统的RS-232-C接口标准有22根线,采用标准25芯D型插头座。后来的PC上使用简化了的9芯D插座。现在应用中25芯插头已很少采用。现在的电脑般有两个串行口:COM1和COM2,你到计算机后面能看到9针D形接口就是了。现在有很多手数据线或者物流接收器都采用COM

如何用C语言写一个读、写串口的程序?

大致过程就是

配置串口通信,包串口号、波特、验位、停止位这些信息;

打开串口,和打开文件一样,在Linux是这样,Windows下没试过,估计也差不多;

发送数据,即写串口,就跟写文件类似;

读取

编写单片机串口收发数据的完整程序(C语言编写)

我用的新唐芯片,8051内核,跟51差不多,望采纳

void UART_Initial (void)

{

P02_Quasi_Mode; //Setting UART pin as Quasi mode for tran *** it

P16_Quasi_Mode; //Setting UART pin as Quasi mode for tran *** it

SCON_1 = 0x50; //UART1 Mode1,REN_1=1,TI_1=1

T3CON = 0x08; //T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1), UART1 in MODE 1

clr_BRCK;

RH3 = HIBYTE(65536 - (1000000/u32Baudrate)-1); /*16 MHz */

RL3 = LOBYTE(65536 - (1000000/u32Baudrate)-1); /*16 MHz */

set_TR3; //Trigger Timer3

}

以上是初始化的

void Send_Data_To_UART1(UINT8 c)

{

TI_1 = 0;

SBUF_1 = c;

while(TI_1==0);

}

这个是发送

void UART_isr (void) interrupt 4 //

怎样在WINDOWS下用C语言编写串口接收数据程序

#include

#include

int main(void)

{

FILE *fp;

char temp;

char buf[100];

if((fp = fopen("3","r")) == NULL)

puts("this way doesn't work! ");

else

puts("this way works! ");

while(1)

{

temp = 0;

fscanf(fp,"%c",&temp);

if(temp != 0)

putchar(temp);

else

Sleep(100);

}

fclose(fp);

return 0;

}

以前的,好久看,不知到对不对。

还下面这段:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

#include

#include

HANDLE h;

int main(void)

{

h=CreateFile(TEXT("COM3"),//COM1口

GENERIC_READ|GENERIC_WRITE, //允许读和写

0, //独占方式

NULL,

OPEN_EXISTING, //打开而不是建

0, //同步式

NULL);

if(h==(HANDLE)-1)

{

printf("打开COM失败! ");

return FALSE;

}

else

{

printf("COM打开成功! ");

}

Setupm(h,1024,1024); //输入缓冲区和输出缓冲区的大小都是1024

COMMTIMEOUTS TimeOuts;

//定读超时

TimeOuts.ReadIntervalTimeout=1000;

TimeOuts.ReadTotalTimeoutMultiplier=500;

TimeOuts.ReadTotalTimeoutConstant=5000;

//设定写超时

TimeOuts.WriteTotalTimeoutMultiplier=500;

TimeOuts.WriteTotalTimeoutConstant=2000;

SetmTimeouts(h,&TimeOuts); //设置超时

DCB dcb;

GetmState(h,&dcb);

dcb.BaudRate=9600; //波特率为9600

dcb.ByteSize=8; //每个字节有8位

dcb.Parity=NOPARITY; //无奇偶校验位

dcb.StopBits=ONE5STOPBITS; //两个停止位

SetmState(h,&dcb);

DWORD wCount;//读取的字节

BOOL bReadStat;

while(1)

{

Purgem(h,PURGE_TXCLEAR|PURGE_RXCLEAR); //清空缓冲区

char str[9]={0};

printf("%s ",str);

bReadStat=ReadFile(h,str,9,&wCount,NULL);

if(!bReadStat)

{

printf("读串口

标签:作文经典 上一篇:描写毛毛虫的词语 描写毛毛虫行动的词语 下一篇:成语误用褒贬的例子 褒贬误用的成语

B. 继续问linux系统下的题目

TCSH shell不同于其他的shell,因为控制结构更符合程序设计语言的格式.例如TCSH 的test条件的控制结构是表达式,而不是linux命令,得到的值是逻辑值true或false,TCSH的表达式与C语言中的表达式基本相销扮册同.

一,TCSH shell变量,脚本,参数用户可以在shell中定义变量,为变量赋值以及引用脚本参数.TCSH使用set,@,setenv定义一变量,也可以用相同的方法定义数值变量和数组,用户通过@命令定义的数值变量来进行算术运算,用户使用圆括号()和方括号[]定义和引用数组.脚本也可以用相同的方法操作,但是有个例外,尽亏宏管可以用echo命令输出提示符,但没有read命令处理输入,相反,必须重定向到一个变量里.

二,脚本输入和脚本输出: $ <用户能够在脚本范围中定义和使用变量.在下例中,使用文本编辑器把赋值操作和echo之类的linux命令放在一个文件中.然后, 可以产生可执行文件并像其他命令一样在命令行中执行它,要记住添加可执行权限,必须使用带u+x参数的chmod命令或者带绝对参数700的chmod命令.在脚本中,可以使用echo命令去输出数据,但是,必须通过重定向标准输入把输入读入变量.在TCSH中没有linux read命令的比较版本.记住TCSH全部的脚本文件的第一行的第一个字符必须是"#"字符.如:
#
#display "hello"
set string="hello"
echo The value of string is $string

set命令和重定向符号结合$<将用户输入的任何数据读入标准的输入中.下例中,把用户输入读入string变量中.
%set string=$<
abc
%echo $string
abc

能够把提示符放置到相同的行用作echo的输入.TCSH使用一个特殊的选项-n,将消除输出字符串中的回车符.光标将保留在输出字符串的结尾处.
%echo -n please enter a string

%cat hello
#
echo -n "please enter a string:"
set string=$<
echo "the value of string is $string"
%chmod u+x hello
%hello
please enter a string:hello
the value of string is hello
%

三,操作符TCSH有一系列标准的赋值,算术缺备和关系运算以及重定向和后台操作等函数赋值运算符 功能说明
= 赋值操作
+= 先加再赋值
-= 先减再赋值
*= 先乘再赋值
/= 先除再赋值
%= 取余再赋值
++ 自增量1
-- 自减量1
算术运算符 说明
- 负号
+ 加法
- 减法
* 乘法
/ 除法
% 取余
关系运算符 说明
> 大于
< 小于
>= 大于等于
<= 小于等于
!= 不等于
== 等于
重定向和管道符TCSH支持标准输入和标准输出的重定向和管道操作.如果设置了noclobber特征,要用重定向操作重写当前文件,需要用符号>!代替>

四,控制结构同其他shell一样,TCSH也有一系列的控制结构控制脚本的命令的执行.while和if控制结构是最常用的控制结构.switch和foreach是更专用的控制结构.switch是if条件的限定形式,检查数值是否等于一系列可能的数值中的一个数值.foreach是循环结构的限定形式.浏览数值列表,给变量赋新的数值.TCSH不同的控制结构列表:

条件控制结构; 功能
if (expression) then 如果expression为真,则执行commands commands
endif

if (expression) then 如果expression为真,则执行command1,否则执行command1 command2.
else
command2
endif

switch (string) 允许在几条替换命令中选择,string为不同的模式case pattern:
commands
breadsw
default:
commands
endsw

循环控制结构: 功能while (expression) 只要expression为真,则重复执行commands,commands 直到expression为假时跳出循环end

foreach variable (argument-list)迭代循环获得和argument-list中一样多的参数commands (每次循环variable被设置为列表的下一个参数;end 操作方式同BSH)

TCSH中的控制结构有别于其他的shell,因为它更接近编程语言(C).TCSH的条件表达式的值为true/false.BASH和TCSH主要区别在于TCSH的结构不可重定向或进行管道输出.

五,测试表达式;()if和while控制结构把表达式用作测试.表达式测试的结果为非零(1)表示真,而零(0)表示假(跟BASH相反).测试表达式可由算术/字符串比较,但是字符串只能作相等和不相等的比较.而且表达式必须要在()括号内.如:
if (expression) then
command
endif
TCSH有一系列的运算符来分别对字符串进行测试比较.正则表达式可以包含shell脚本的指令的字符串.如:
if ( $var =~[Hh]* ) then #如果变量$var以字母是大写/小写Hh开头,的字符串
echo information #执行命令
endif #结束
有很多测试文件的操作与BASH完全相同.如:
if ( -r myfile ) then #测试myfile是否可读
echo info
endif

测试表达式的基本操作:
字符串比较: 功能
== 是否相等,若相等返回真
!= 是否不等,若不等返回真
=~ 字符串和模式进行测试是否相等(模式为任意正则表达式)
!~ 字符串和模式测试是否不等(模式为任意正则表达式)文件测试: 功能
-e 测试文件是否存在
-r 测试文件是否可读
-w 测试文件是否可写
-x 测试文件是否可执行
-d 测试文件名是否为目录
-f 测试文件是否为普通文件
-o 测试文件是否被用户所拥有
-z 测试文件是否为空
逻辑运算符: 功能
&& 与运算,两个条件同时蛮族
|| 或运算,有一个条件满足
! 取反

六,TCSH内建命令
1,数字变量:@
在TCSH中,用@命令代替set命令来声明数字变量,然后进行算术,关系和位操作,数字和字符串变量是两个不同的对象,需要用不同的方法管理,不能把set用于数值变量的设置@命令由关键词,变量名,赋值运算符和表达式构成.如:
%@ num=10 #注意空格
%@ sum=2 * ($num + 3)
%echo $sum
%26

2,alias
格式:alias [name[command]]
关键词alias 别名name 引用的命令command
如:
alias list ls
alias list 'ls -l'

3,argv
当脚本被执行时,命令行中的单词被分析并放入argv数组中.argv[0],argv[1]...argv[n],其中argv[0]保存命令名,argv[1]保存命令的第一个参数,argv[n]命令的第n个参数.argv数组元素可缩写元素号码,前面加$.如:$argv[1]写为$1.$argv[*]写为$*.#argv参数标识符包含输入在命令行中的参数号码,可检查$#argv变量.如:
arglist
#
echo "The number of arguments entered is $#argv"
echo "The list of arguments is : $argv[*]"

%tcsh arglist a b c
The number of arguments entered is 3
The list of arguments is : a b c
argv变量列表:
命令行参数 说明
$argv[0]或$0 命令名
$argv[n]或$n 从1($1-$)开始的第n个命令行参数
$argv[*]或$* 从1开始的所有命令行参数
$#argv或$# 命令行参数的计数

4,bg
格式:bg [%job]
bg命令把指定的任务放入后台.如果此任务已经停止,则继续执行,如果没有参数,将当前任务放入后台.(详细用法与BASH相同此处略)

5,break
格式:break
break命令用于退出最接近的foreach/while循环过程.执行同一行中其他的命令.

6,breaksw
格式:breaksw
可以从switch语句处中断,在endsw后继续执行.

7,builtins
列出全部shell的内建命令表.

8,cd
格式:cd [-p][-l][-nl -v][name]如果给出目录名,此命令把name设置为当前目录,如果命令中没有name,当前目录自动设置成用户主目录.用于name的"-"引用上一级目录,如果参数name没有给出子目录,或不是全路径,或使用./或../引用当前目录及父目录,那么就检查在cdpath shell变量中列出的目录来寻找该目录名.如果此操作失败,将检查shell变量中是否保存着的目录路径名.
用-p选项,linux显示目录列表, 用-l,-n,-v选项与用在dirs命令中的选项完全相同.默认选项-p.

9,continue
此命令继续执行最靠近while/foreach语句.当前行其余的命令被执行.

10,dirs
格式:dirs [-l][-n|-v]
dirs -S|-L [filename]
dir -c
如果不带参数,dirs将显示目录列表,列表开头被列在作侧,第一个目录是当前目录.带-l选项,用户主目录中的全部子目录被展开,输入项在到达屏幕边缘时,-n选项隐藏输入项,-v选项显示每一行的输入项入口,-c选项将清除目录列表,-S选项可以把目录列表作为一系列的cd和pushed命令保存在文件中,-L选项可以从指定的文件中将cd和pushed命令读入,该文件包含-S选项所存储的cd和pushed命令.如果没有指定的文件名,将使用赋值到dirsfile shell变量中的文件名.如果没有设置dirsfile,将使用~/.cshdirs,在启动时注册shell将对dirs -L求值,如果设置了savedirs,退出前使用dirs -S,由于在~/.cshdirs之前,仅仅~/.tcshrc是正常来源,dirsfile应该以~/.tcshrc设置而不是以~/.login设置.

11,echo
格式:echo [-n] word/string此命令把每个单词或字符串写入shell的标准输出.可设置echostyle shell变量来仿真选项以及BSD的换码序列或者echo的System V 版本.

12,eval
格式:eval argument...
此命令把参数作
一,TCSH shell变量,脚本,参数
用户可以在shell中定义变量,为变量赋值以及引用脚本参数.TCSH使用set,@,setenv定
义一变量,也可以用相同的方法定义数值变量和数组,用户通过@命令定义的数值变量来
进行算术运算,用户使用圆括号()和方括号[]定义和引用数组.脚本也可以用相同的方
法操作,但是有个例外,尽管可以用echo命令输出提示符,但没有read命令处理输入,相
反,必须重定向到一个变量里.

二,脚本输入和脚本输出: $ <
用户能够在脚本范围中定义和使用变量.在下例中,使用文本编辑器把赋值操作和echo
之类的linux命令放在一个文件中.然后, 可以产生可执行文件并像其他命令一样在命
令行中执行它,要记住添加可执行权限,必须使用带u+x参数的chmod命令或者带绝对参
数700的chmod命令.在脚本中,可以使用echo命令去输出数据,但是,必须通过重定向标
准输入把输入读入变量.在TCSH中没有linux read命令的比较版本.记住TCSH全部的脚
本文件的第一行的第一个字符必须是"#"字符.
如:
#
#display "hello"
set string="hello"
echo The value of string is $string

set命令和重定向符号结合$<将用户输入的任何数据读入标准的输入中.下例中,把用户
输入读入string变量中.
%set string=$<
abc
%echo $string
abc

C. fedora 12 没有sar命令

sar是Linux外部安装的工具,可以到http://pagesperso-orange.fr/sebastien.godard/download.html去下载
1 安装
tar zxvf xxx.tar.gz
cd xxx
./configure
make
make install
2 使用
pidstat 2 5
//每隔2秒,显示5次,所有活动进程的CPU使用情况
pidstat -p 3132 2 5
//每隔2秒,显示5次,PID为3132的进程的CPU使用情况显示
pidstat -p 3132 2 5 -r
//每隔2秒,显示5次,PID为3132的进程的内存使用情况显示

查看CPU使用情况

sar 2 5
//每隔2秒,显示5次,CPU使用的情况

%usr:CPU处在用户模式下的时间百分比。
%sys:CPU处在系统模式下的时间百分比。
%wio:CPU等待输入输出完成时间的百分比。
%idle:CPU空闲时间百分比。

在所有的显示中,我们应主要注意%wio和%idle,%wio的值过高,表示硬盘存在I/O瓶颈,
%idle值高,表示CPU较空闲,如果%idle值高但系统响应慢时,有可能是CPU等待分配内存,
此时应加大内存容量。%idle值如果持续低于10,那么系统的CPU处理能力相对较低,表
明慧指握系统中最需要解决的资源是CPU。

sar 1 10 > data.txt
//每隔1秒,写入10次,把CPU使用数据保存到data.txt文件中。
sar 1 0 -e 15:00:00 > data.txt
//每隔1秒记录CPU的使用情况,直到15点,数据将保存到data.txt文件中。(-e 参数表示结束时间,注意时间格式:必须为hh:mm:ss格式)
sar 1 0 -r -e 15:00:00 > data.txt
//每隔1秒记录内存使用情况,直到15点,数据将保存到data.txt文件中。
sar 1 0 -n DEV -e 15:00:00 > data.txt
//每隔1秒记录网络使用情况,直到15点,数据将保存到data.txt文件中。

例二:使用命行sar -v t n

例如,每30秒采样一次,连续采样5次,观察核心表的状态,需键入如下命令:

# sar -v 30 5

屏幕显示:
SCO_SV scosysv 3.2v5.0.5 i80386 10/01/2001
10:33:23 proc-sz ov inod-sz ov file-sz ov lock-sz (-v)
10:33:53 305/ 321 0 1337/2764 0 1561/1706 0 40/ 128
10:34:23 308/ 321 0 1340/2764 0 1587/1706 0 37/ 128
10:34:53 305/ 321 0 1332/2764 0 1565/1706 0 36/ 128
10:35:23 308/ 321 0 1338/2764 0 1592/1706 0 37/ 128
10:35:53 308/ 321 0 1335/2764 0 1591/1706 0 37/ 128

显示内容包括:

proc-sz:目前核心中正在使用或分配的进程表的表项数,由核心参数MAX-PROC控制。

inod-sz:目前庆前核心中正在使用或分配的i节点表的表项数,由核心参数
MAX-INODE控制。

file-sz: 目前核心中正在使用或分配的文件表的表项数,由核心参数MAX-FILE控
制。

ov:溢出出现的次数。

Lock-sz:目前核心中正在使用或分配的记录加锁的表项数,逗悉由核心参数MAX-FLCKRE
控制。

显示格式为

实际使用表项/可以使用的表项数

显示内容表示,核心使用完全正常,三个表没有出现溢出现象,核心参数不需调整,如
果出现溢出时,要调整相应的核心参数,将对应的表项数加大。

例三:使用命行sar -d t n

例如,每30秒采样一次,连续采样5次,报告设备使用情况,需键入如下命令:

# sar -d 30 5

屏幕显示:

SCO_SV scosysv 3.2v5.0.5 i80386 10/01/2001
11:06:43 device %busy avque r+w/s blks/s avwait avserv (-d)
11:07:13 wd-0 1.47 2.75 4.67 14.73 5.50 3.14
11:07:43 wd-0 0.43 18.77 3.07 8.66 25.11 1.41
11:08:13 wd-0 0.77 2.78 2.77 7.26 4.94 2.77
11:08:43 wd-0 1.10 11.18 4.10 11.26 27.32 2.68
11:09:13 wd-0 1.97 21.78 5.86 34.06 69.66 3.35
Average wd-0 1.15 12.11 4.09 15.19 31.12 2.80

显示内容包括:

device: sar命令正在监视的块设备的名字。
%busy: 设备忙时,传送请求所占时间的百分比。
avque: 队列站满时,未完成请求数量的平均值。
r+w/s: 每秒传送到设备或从设备传出的数据量。
blks/s: 每秒传送的块数,每块512字节。
avwait: 队列占满时传送请求等待队列空闲的平均时间。
avserv: 完成传送请求所需平均时间(毫秒)。

在显示的内容中,wd-0是硬盘的名字,%busy的值比较小,说明用于处理传送请求的有
效时间太少,文件系统效率不高,一般来讲,%busy值高些,avque值低些,文件系统
的效率比较高,如果%busy和avque值相对比较高,说明硬盘传输速度太慢,需调整。

例四:使用命行sar -b t n

例如,每30秒采样一次,连续采样5次,报告缓冲区的使用情况,需键入如下命令:

# sar -b 30 5

屏幕显示:

SCO_SV scosysv 3.2v5.0.5 i80386 10/01/2001
14:54:59 bread/s lread/s %rcache bwrit/s lwrit/s %wcache pread/s pwrit/s (-b)
14:55:29 0 147 100 5 21 78 0 0
14:55:59 0 186 100 5 25 79 0 0
14:56:29 4 232 98 8 58 86 0 0
14:56:59 0 125 100 5 23 76 0 0
14:57:29 0 89 100 4 12 66 0 0
Average 1 156 99 5 28 80 0 0

显示内容包括:

bread/s: 每秒从硬盘读入系统缓冲区buffer的物理块数。
lread/s: 平均每秒从系统buffer读出的逻辑块数。
%rcache: 在buffer cache中进行逻辑读的百分比。
bwrit/s: 平均每秒从系统buffer向磁盘所写的物理块数。
lwrit/s: 平均每秒写到系统buffer逻辑块数。
%wcache: 在buffer cache中进行逻辑读的百分比。
pread/s: 平均每秒请求物理读的次数。
pwrit/s: 平均每秒请求物理写的次数。

在显示的内容中,最重要的是%cache和%wcache两列,它们的值体现着buffer的使用效
率,%rcache的值小于90或者%wcache的值低于65,应适当增加系统buffer的数量,buffer
数量由核心参数NBUF控制,使%rcache达到90左右,%wcache达到80左右。但buffer参数
值的多少影响I/O效率,增加buffer,应在较大内存的情况下,否则系统效率反而得不到
提高。

例五:使用命行sar -g t n

例如,每30秒采样一次,连续采样5次,报告串口I/O的操作情况,需键入如下命令:

# sar -g 30 5

屏幕显示:

SCO_SV scosysv 3.2v5.0.5 i80386 11/22/2001
17:07:03 ovsiohw/s ovsiodma/s ovclist/s (-g)
17:07:33 0.00 0.00 0.00
17:08:03 0.00 0.00 0.00
17:08:33 0.00 0.00 0.00
17:09:03 0.00 0.00 0.00
17:09:33 0.00 0.00 0.00
Average 0.00 0.00 0.00

显示内容包括:

ovsiohw/s:每秒在串口I/O硬件出现的溢出。

ovsiodma/s:每秒在串口I/O的直接输入输出通道高速缓存出现的溢出。

ovclist/s :每秒字符队列出现的溢出。

在显示的内容中,每一列的值都是零,表明在采样时间内,系统中没有发生串口I/O溢
出现象。

D. 实现双机通信的C语言代码

代码要求是什么? 基本实现 ping 的功能?

ping 代码

#include <windows.h>
#include <winsock2.h>

#define IP_RECORD_ROUTE 0x7

#define ICMP_ECHO 8
#define ICMP_ECHOREPLY 0
#define ICMP_MIN 8 // minimum 8 byte icmp packet (just header)

#define DEF_PACKET_SIZE 32 // Default packet size
#define MAX_PACKET 60000 // Max ICMP packet size 1024
#define MAX_IP_HDR_SIZE 60 // Max IP header size w/options

typedef struct _iphdr
{
unsigned int h_len:4; // Length of the header
unsigned int version:4; // Version of IP
unsigned char tos; // Type of service
unsigned short total_len; // Total length of the packet
unsigned short ident; //郑旅 Unique identifier
unsigned short frag_and_flags; // Flags
unsigned char ttl; // Time to live
unsigned char proto; // Protocol (TCP, UDP etc)
unsigned short checksum; // IP checksum

unsigned int sourceIP;
unsigned int destIP;
} IpHeader;

//
/棚丛物/ ICMP header structure
//
typedef struct _icmphdr
{
BYTE i_type;
BYTE i_code; // Type sub code
USHORT i_cksum;
USHORT i_id;
USHORT i_seq;
// This is not the standard header, but we reserve space for time
ULONG timestamp;
} IcmpHeader;

//
// IP option header - use with socket option IP_OPTIONS
//
typedef struct _ipoptionhdr
{
unsigned char code; // Option type
unsigned char len; /链液/ Length of option hdr
unsigned char ptr; // Offset into options
unsigned long addr[9]; // List of IP addrs
} IpOptionHeader;

//
// Function: FillICMPData
//
// Description:
// Helper function to fill in various fields for our ICMP request
//
void FillICMPData(char *icmp_data, int datasize)
{
IcmpHeader *icmp_hdr = NULL;
char *datapart = NULL;

icmp_hdr = (IcmpHeader*)(icmp_data); //+sizeof(IpHeader)
icmp_hdr->i_type = ICMP_ECHO; // Request an ICMP echo
icmp_hdr->i_code = 0;
icmp_hdr->i_id = (USHORT)GetCurrentProcessId();
icmp_hdr->i_cksum = 0;
icmp_hdr->i_seq = 0;

datapart = icmp_data + sizeof(IcmpHeader);
//
// Place some junk in the buffer
//
memset(datapart,'E', datasize - sizeof(IcmpHeader));
}
//---------------------------------------------------------------------------

USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;

while (size > 1)
{
cksum += *buffer++;
size -= sizeof(USHORT);
}
if (size)
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}
//---------------------------------------------------------------------------

void DecodeIPOptions(char *buf, int bytes, void CALLBACK (*pDis)(const char* szMes))
{
IpOptionHeader *ipopt = NULL;
IN_ADDR inaddr;
int i;
HOSTENT *host = NULL;
char szMesBuffer[255];
ipopt = (IpOptionHeader *)(buf + 20);

if (pDis != NULL)
{
pDis("RR: ");
}
for(i = 0; i < (ipopt->ptr / 4) - 1; i++)
{
inaddr.S_un.S_addr = ipopt->addr[i];
if (i != 0)
{
if (pDis != NULL)
{
pDis(" ");
}
}
host = gethostbyaddr((char *)&inaddr.S_un.S_addr, sizeof(inaddr.S_un.S_addr), AF_INET);
if (host)
{
if (pDis != NULL)
{
wsprintf(szMesBuffer, "(%-15s) %s", inet_ntoa(inaddr), host->h_name);
pDis(szMesBuffer);
}
}
else
{
if (pDis != NULL)
{
wsprintf(szMesBuffer, "(%-15s)", inet_ntoa(inaddr));
pDis(szMesBuffer);
}
}
}
return;
}
//---------------------------------------------------------------------------

int DecodeICMPHeader(char *buf, int bytes, struct sockaddr_in *from, void CALLBACK (*pDis)(const char* szMes))
{
IpHeader *iphdr = NULL;
IcmpHeader *icmphdr = NULL;
unsigned short iphdrlen;
DWORD tick;
static int icmpcount = 0;
char szMesBuffer[255];
char szMesBuffer1[255];

iphdr = (IpHeader *)buf;
// Number of 32-bit words * 4 = bytes
iphdrlen = iphdr->h_len * 4;
tick = GetTickCount();

if ((iphdrlen == MAX_IP_HDR_SIZE) && (!icmpcount))
DecodeIPOptions(buf, bytes, pDis);

if (bytes < iphdrlen + ICMP_MIN)
{
//printf("Too few bytes from %s\n", inet_ntoa(from->sin_addr));
if (pDis != NULL)
{
wsprintf(szMesBuffer, "Too few bytes from %s", inet_ntoa(from->sin_addr));
pDis(szMesBuffer);
}
}
icmphdr = (IcmpHeader*)(buf + iphdrlen);

if (icmphdr->i_type != ICMP_ECHOREPLY)
{
//printf("nonecho type %d recvd\n", icmphdr->i_type);
if (pDis != NULL)
{
wsprintf(szMesBuffer, "nonecho type %d recvd", icmphdr->i_type);
pDis(szMesBuffer);
}
return -1;
}
// Make sure this is an ICMP reply to something we sent!
//
if (icmphdr->i_id != (USHORT)GetCurrentProcessId())
{
//printf("someone else's packet!\n");
if (pDis != NULL)
{
pDis("someone else's packet!");
}
return -1;
}
//printf("%d bytes from %s:", bytes, inet_ntoa(from->sin_addr));
//printf(" icmp_seq = %d. ", icmphdr->i_seq);
//printf(" time: %d ms", tick - icmphdr->timestamp);
//printf("\n");
if (pDis != NULL)
{
wsprintf(szMesBuffer, "%d bytes from %s:", bytes, inet_ntoa(from->sin_addr));
wsprintf(szMesBuffer1, " icmp_seq = %d. ", icmphdr->i_seq);
lstrcat(szMesBuffer, szMesBuffer1);
wsprintf(szMesBuffer1, " time: %d ms", tick - icmphdr->timestamp);
lstrcat(szMesBuffer, szMesBuffer1);
wsprintf(szMesBuffer1, " TTL = %d", iphdr->ttl);
lstrcat(szMesBuffer, szMesBuffer1);
pDis(szMesBuffer);
}

icmpcount++;
return tick - icmphdr->timestamp;
}
//---------------------------------------------------------------------------

ping(const char* szTargetAddress, int iDataSize, int iTimeOut, int iTimes, bool bReply, void CALLBACK (*pDis)(const char* szMes))
{
WSADATA wsaData;
SOCKET sockRaw = INVALID_SOCKET;
struct sockaddr_in dest,
from;
int bread,
fromlen = sizeof(from),
timeout = iTimeOut,
ret;
char *icmp_data = NULL,
*recvbuf = NULL;
unsigned int addr = 0;
USHORT seq_no = 0;
struct hostent *hp = NULL;
IpHeader ip_header;
IpOptionHeader ipopt;
char szMesBuffer[255];

if (timeout > 3000)
timeout = 3000;
else if (timeout < 100)
timeout = 100;

if (pDis != NULL)
{
wsprintf(szMesBuffer, "ping %s with %d bytes of data:", szTargetAddress, iDataSize);
pDis(szMesBuffer);
}

if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
//printf("WSAStartup() failed: %d\n", GetLastError());
if (pDis != NULL)
{
wsprintf(szMesBuffer, "WSAStartup() failed: %d", GetLastError());
pDis(szMesBuffer);
}
return -1;
}

sockRaw = WSASocket(AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0, WSA_FLAG_OVERLAPPED);
if (sockRaw == INVALID_SOCKET)
{
//printf("WSASocket() failed: %d\n", WSAGetLastError());
if (pDis != NULL)
{
wsprintf(szMesBuffer, "WSASocket() failed: %d", WSAGetLastError());
pDis(szMesBuffer);
}
return -1;
}

// Set the send/recv timeout values
//
bread = setsockopt(sockRaw, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout));
if(bread == SOCKET_ERROR)
{
//printf("setsockopt(SO_RCVTIMEO) failed: %d\n", WSAGetLastError());
if (pDis != NULL)
{
wsprintf(szMesBuffer, "setsockopt(SO_RCVTIMEO) failed: %d", WSAGetLastError());
pDis(szMesBuffer);
}
return -1;
}
bread = setsockopt(sockRaw, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout));
if (bread == SOCKET_ERROR)
{
//printf("setsockopt(SO_SNDTIMEO) failed: %d\n", WSAGetLastError());
if (pDis != NULL)
{
wsprintf(szMesBuffer, "setsockopt(SO_SNDTIMEO) failed: %d", WSAGetLastError());
pDis(szMesBuffer);
}
return -1;
}
memset(&dest, 0, sizeof(dest));
//
// Resolve the endpoint's name if necessary
//
dest.sin_family = AF_INET;
if ((dest.sin_addr.s_addr = inet_addr(szTargetAddress)) == INADDR_NONE)
{
if ((hp = gethostbyname(szTargetAddress)) != NULL)
{
memcpy(&(dest.sin_addr), hp->h_addr, hp->h_length);
dest.sin_family = hp->h_addrtype;
//printf("dest.sin_addr = %s\n", inet_ntoa(dest.sin_addr));
if (pDis != NULL)
{
wsprintf(szMesBuffer, "dest.sin_addr = %s", inet_ntoa(dest.sin_addr));
pDis(szMesBuffer);
}
}
else
{
//printf("gethostbyname() failed: %d\n", WSAGetLastError());
if (pDis != NULL)
{
wsprintf(szMesBuffer, "gethostbyname() failed: %d", WSAGetLastError());
pDis(szMesBuffer);
}
return -1;
}
}
//
// Create the ICMP packet
//

int datasize = iDataSize;
if (datasize < 0)
datasize = DEF_PACKET_SIZE;

datasize += sizeof(IcmpHeader);

if (datasize > MAX_PACKET)
datasize = MAX_PACKET;

icmp_data = (char *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, MAX_PACKET);
recvbuf = (char *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, MAX_PACKET);
if (!icmp_data)
{
//printf("HeapAlloc() failed: %d\n", GetLastError());
if (pDis != NULL)
{
wsprintf(szMesBuffer, "HeapAlloc() failed: %d", GetLastError());
pDis(szMesBuffer);
}
return -1;
}
//memset(icmp_data, 0, datasize); //, MAX_PACKET
FillICMPData(icmp_data, datasize);
//
// Start sending/receiving ICMP packets
//
int nCount = 0;
int iReceiveCount = 0;
if (iTimes < 2)
{
iTimes = 2;
}
while(1)
{
int bwrote;

if (nCount++ == iTimes)
break;

((IcmpHeader*)icmp_data)->i_cksum = 0;
((IcmpHeader*)icmp_data)->timestamp = GetTickCount();
((IcmpHeader*)icmp_data)->i_seq = seq_no++;
((IcmpHeader*)icmp_data)->i_cksum = checksum((USHORT*)icmp_data, datasize);

bwrote = sendto(sockRaw, icmp_data, datasize, 0, (struct sockaddr*)&dest, sizeof(dest));
if (bwrote == SOCKET_ERROR)
{
if (WSAGetLastError() == WSAETIMEDOUT)
{
//printf("timed out\n");
if (pDis != NULL)
{
wsprintf(szMesBuffer, "timed out");
pDis(szMesBuffer);
}
continue;
}
//printf("sendto() failed: %d\n", WSAGetLastError());
if (pDis != NULL)
{
wsprintf(szMesBuffer, "sendto() failed: %d", WSAGetLastError());
pDis(szMesBuffer);
}
return -1;
}
if (bwrote < datasize)
{
//printf("Wrote %d bytes\n", bwrote);
if (pDis != NULL)
{
wsprintf(szMesBuffer, "Wrote %d bytes", bwrote);
pDis(szMesBuffer);
}
}
bread = recvfrom(sockRaw, recvbuf, MAX_PACKET, 0, (struct sockaddr*)&from, &fromlen);
if (bread == SOCKET_ERROR)
{
if (WSAGetLastError() == WSAETIMEDOUT)
{
//printf("timed out\n");
if (pDis != NULL)
{
wsprintf(szMesBuffer, "timed out");
pDis(szMesBuffer);
}
continue;
}
//printf("recvfrom() failed: %d\n", WSAGetLastError());
if (pDis != NULL)
{
wsprintf(szMesBuffer, "recvfrom() failed: %d", WSAGetLastError());
pDis(szMesBuffer);
}
return -1;
}
DecodeICMPHeader(recvbuf, bread, &from, pDis); //return replay time ms
iReceiveCount++;

Sleep(50);//1000
}
// Cleanup
//
if (sockRaw != INVALID_SOCKET)
closesocket(sockRaw);
HeapFree(GetProcessHeap(), 0, recvbuf);
HeapFree(GetProcessHeap(), 0, icmp_data);

WSACleanup();
if (pDis != NULL && bReply)
{
pDis(" ");
nCount--;
wsprintf(szMesBuffer, "Packets: Sent = %d, Received = %d, Lost = %d (%d%s", nCount, iReceiveCount, nCount - iReceiveCount, (nCount - iReceiveCount) * 100 / nCount, "% loss)");
pDis(szMesBuffer);
pDis(" ");
}

return 0;
}
//---------------------------------------------------------------------------

调用方法:

ping(
szTargetAddress, //目标地址 //IP 或网址
iDataSize, //数据包大小
iTimeOut, //延时
iTimes, //发送次数
bReply, //是否显示信息
CALLBACK (*pDis)(const char* szMes)//显示信息的函数指针
);

void pingMessage(const char* szMes);

main()
{
ping("127.0.0.1", 32, 500, 5, true, pingMessage);
}

void pingMessage(const char* szMes)
{
printf("%s\n", szMes);
}

E. LINUX下ping 程序如何写

/******************************************************************************\
* ping.c - Simple ping utility using SOCK_RAW
*
* This is a part of the Microsoft Source Code Samples.
* Copyright 1996-1997 Microsoft Corporation.
* All rights reserved.
* This source code is only intended as a supplement to
* Microsoft Development Tools and/or WinHelp documentation.
* See these sources for detailed information regarding the
* Microsoft samples programs.
\******************************************************************************/

#pragma pack(4)

#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>

#define ICMP_ECHO 8
#define ICMP_ECHOREPLY 0

#define ICMP_MIN 8 // minimum 8 byte icmp packet (just header)

/* The IP header */
typedef struct iphdr {
unsigned int h_len:4; // length of the header
unsigned int version:4; // Version of IP
unsigned char tos; // Type of service
unsigned short total_len; // total length of the packet
unsigned short ident; // unique identifier
unsigned short frag_and_flags; // flags
unsigned char ttl;
unsigned char proto; // protocol (TCP, UDP etc)
unsigned short checksum; // IP checksum

unsigned int sourceIP;
unsigned int destIP;

}IpHeader;

//
// ICMP header
//
typedef struct _ihdr {
BYTE i_type;
BYTE i_code; /* type sub code */
USHORT i_cksum;
USHORT i_id;
USHORT i_seq;
/* This is not the std header, but we reserve space for time */
ULONG timestamp;
}IcmpHeader;

#define STATUS_FAILED 0xFFFF
#define DEF_PACKET_SIZE 32
#define MAX_PACKET 1024

#define xmalloc(s) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(s))
#define xfree(p) HeapFree (GetProcessHeap(),0,(p))

void fill_icmp_data(char *, int);
USHORT checksum(USHORT *, int);
void decode_resp(char *,int ,struct sockaddr_in *);

void Usage(char *progname){

fprintf(stderr,"Usage:\n");
fprintf(stderr,"%s <host> [data_size]\n",progname);
fprintf(stderr,"datasize can be up to 1Kb\n");
ExitProcess(STATUS_FAILED);

}
int main(int argc, char **argv){

WSADATA wsaData;
SOCKET sockRaw;
struct sockaddr_in dest,from;
struct hostent * hp;
int bread,datasize;
int fromlen = sizeof(from);
int timeout = 1000;
char *dest_ip;
char *icmp_data;
char *recvbuf;
unsigned int addr=0;
USHORT seq_no = 0;

if (WSAStartup(MAKEWORD(2,1),&wsaData) != 0){
fprintf(stderr,"WSAStartup failed: %d\n",GetLastError());
ExitProcess(STATUS_FAILED);
}

if (argc <2 ) {
Usage(argv[0]);
}
sockRaw = WSASocket (AF_INET,
SOCK_RAW,
IPPROTO_ICMP,
NULL, 0,0);

if (sockRaw == INVALID_SOCKET) {
fprintf(stderr,"WSASocket() failed: %d\n",WSAGetLastError());
ExitProcess(STATUS_FAILED);
}
bread = setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,
sizeof(timeout));
if(bread == SOCKET_ERROR) {
fprintf(stderr,"failed to set recv timeout: %d\n",WSAGetLastError());
ExitProcess(STATUS_FAILED);
}
timeout = 1000;
bread = setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,
sizeof(timeout));
if(bread == SOCKET_ERROR) {
fprintf(stderr,"failed to set send timeout: %d\n",WSAGetLastError());
ExitProcess(STATUS_FAILED);
}
memset(&dest,0,sizeof(dest));

hp = gethostbyname(argv[1]);

if (!hp){
addr = inet_addr(argv[1]);
}
if ((!hp) && (addr == INADDR_NONE) ) {
fprintf(stderr,"Unable to resolve %s\n",argv[1]);
ExitProcess(STATUS_FAILED);
}

if (hp != NULL)
memcpy(&(dest.sin_addr),hp->h_addr,hp->h_length);
else
dest.sin_addr.s_addr = addr;

if (hp)
dest.sin_family = hp->h_addrtype;
else
dest.sin_family = AF_INET;

dest_ip = inet_ntoa(dest.sin_addr);

if (argc >2) {
datasize = atoi(argv[2]);
if (datasize == 0)
datasize = DEF_PACKET_SIZE;

}
else
datasize = DEF_PACKET_SIZE;

datasize += sizeof(IcmpHeader);

icmp_data = xmalloc(MAX_PACKET);
recvbuf = xmalloc(MAX_PACKET);

if (!icmp_data) {
fprintf(stderr,"HeapAlloc failed %d\n",GetLastError());
ExitProcess(STATUS_FAILED);
}

memset(icmp_data,0,MAX_PACKET);
fill_icmp_data(icmp_data,datasize);

while(1) {
int bwrote;

((IcmpHeader*)icmp_data)->i_cksum = 0;
((IcmpHeader*)icmp_data)->timestamp = GetTickCount();

((IcmpHeader*)icmp_data)->i_seq = seq_no++;
((IcmpHeader*)icmp_data)->i_cksum = checksum((USHORT*)icmp_data,
datasize);

bwrote = sendto(sockRaw,icmp_data,datasize,0,(struct sockaddr*)&dest,
sizeof(dest));
if (bwrote == SOCKET_ERROR){
if (WSAGetLastError() == WSAETIMEDOUT) {
printf("timed out\n");
continue;
}
fprintf(stderr,"sendto failed: %d\n",WSAGetLastError());
ExitProcess(STATUS_FAILED);
}
if (bwrote < datasize ) {
fprintf(stdout,"Wrote %d bytes\n",bwrote);
}
bread = recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(struct sockaddr*)&from,
&fromlen);
if (bread == SOCKET_ERROR){
if (WSAGetLastError() == WSAETIMEDOUT) {
printf("timed out\n");
continue;
}
fprintf(stderr,"recvfrom failed: %d\n",WSAGetLastError());
ExitProcess(STATUS_FAILED);
}
decode_resp(recvbuf,bread,&from);
Sleep(1000);

}
return 0;

}
/*
The response is an IP packet. We must decode the IP header to locate
the ICMP data
*/
void decode_resp(char *buf, int bytes,struct sockaddr_in *from) {

IpHeader *iphdr;
IcmpHeader *icmphdr;
unsigned short iphdrlen;

iphdr = (IpHeader *)buf;

iphdrlen = iphdr->h_len * 4 ; // number of 32-bit words *4 = bytes

if (bytes < iphdrlen + ICMP_MIN) {
printf("Too few bytes from %s\n",inet_ntoa(from->sin_addr));
}

icmphdr = (IcmpHeader*)(buf + iphdrlen);

if (icmphdr->i_type != ICMP_ECHOREPLY) {
fprintf(stderr,"non-echo type %d recvd\n",icmphdr->i_type);
return;
}
if (icmphdr->i_id != (USHORT)GetCurrentProcessId()) {
fprintf(stderr,"someone else's packet!\n");
return ;
}
printf("%d bytes from %s:",bytes, inet_ntoa(from->sin_addr));
printf(" icmp_seq = %d. ",icmphdr->i_seq);
printf(" time: %d ms ",GetTickCount()-icmphdr->timestamp);
printf("\n");

}

USHORT checksum(USHORT *buffer, int size) {

unsigned long cksum=0;

while(size >1) {
cksum+=*buffer++;
size -=sizeof(USHORT);
}

if(size ) {
cksum += *(UCHAR*)buffer;
}

cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}
/*
Helper function to fill in various stuff in our ICMP request.
*/
void fill_icmp_data(char * icmp_data, int datasize){

IcmpHeader *icmp_hdr;
char *datapart;

icmp_hdr = (IcmpHeader*)icmp_data;

icmp_hdr->i_type = ICMP_ECHO;
icmp_hdr->i_code = 0;
icmp_hdr->i_id = (USHORT)GetCurrentProcessId();
icmp_hdr->i_cksum = 0;
icmp_hdr->i_seq = 0;

datapart = icmp_data + sizeof(IcmpHeader);
//
// Place some junk in the buffer.
//
memset(datapart,'E', datasize - sizeof(IcmpHeader));

}

F. 1.linux系统下shell脚本用case语句编写四则运算 2.linux系统下shell脚本输入数字串。进行反序输出

如果只做四个简单的运算这应应该可以

shell脚本代码如下:
#!/bin/bash
read -p "input num1:" a
read -p "input num2:" b
read -p "input operator:" o
case $o in
+) let "res=a + b"
echo $res;;
-) let "res=a - b"
echo $res;;
/) awk 'BEGIN{printf "%.2f\n",'$a'/'$b'}';;
*) let "res=a * b"
echo $res;;
esac

G. sar命令查看历史数据

前言

有的时候,我们要通过对系统的cpu负载等性能数值的查看,来判排查系统产生某种故障(经常死机或者运行速度突然变慢)的原因。但是,简单的top,uptime,w等命令只可以查看当前的负载,而无法查看过去的某一时间段的cpu的负载情况。

下面就介绍一个用于性能分析的命令,其可以用于查看过去的某一时间段的cpu的负载情况(系统性能)。

查看某一时间段的cpu使用情况,请直接跳到第七节。

一、sar概念

sysstat是Linux 系统中的常用工具包,而sar 是 Linux中sysstat工具包中的用于监控Linux系统性能的工具之一。

sysstat 工具包中包含两种类型的工具:即时查看工具(iostat、mpstat、sar);累计统计工具(sar)

因此sar命令,又叫做系统活动情况报告。不仅可以实时查看服务器的性能,还可以做累计统计。

二、sar可监控的范围

文件的读写情况

系统调用的使用情况

磁盘I/O使用情况

CPU的使用统计

内存使用状况

进程活动

IPC有关的活动

三、sar命令使用环境

sar命令使用格式:

sar+ 命令行选项(可选) + 间隔时间(可选) + 次数(可选)

常用来判断一个系统瓶颈问题

查询CPU可用 sar -u 和 sar -q 等来查看查询内存可用 sar -B、sar -r 和 sar -W 等来查看查询io可用 sar -b、sar -u 和 sar -d 等来查看

四、sar命令累计统计的实现过程

系统会通过调用 /usr/lib64/sa/ 中的三个工具(sa1 sa2 sadc)来实现,周期地记录当时的系统性能的信息的功能。

sa1 :收集并将每天的系统性能的信息写入一个二进制的文件中,它是sadc的前端程序

sa2 :收集每天的系统活跃的信息并写入总结性的文件中,其作为 sar的前端程序

sadc :收集系统的动态数据的数据并写入一个二进制的文件中,其作为 sar 工具的后端

五、sar的日志

sar是由有类似日志切割的功能的,它会依据/etc/cron.d/sysstat中的计划任务,将日志放入/var/log/sa/中

注:日志为二进制文件,不可使用more、less、vim工具查看,必须使用sar或sadf

可以根据需求修改该计划任务

如要查看某一时间段的服务器的性能的其中一个方法就是:使用sar命令,查看当天的日志文件

sar -f /var/log/sa/sa15

[root@    lib64]#sar-f/var/log/sa/sa15Linux3.10.0-327.el7.x86_64(ops-node7)07/15/2018_x86_64_(24CPU)12:00:01AMCPU%user%nice%system%iowait%steal%idle12:10:01AMall1.350.000.850.120.0097.6712:20:01AMall1.320.000.860.110.0097.7112:30:02AMall1.370.000.870.110.0097.6512:40:01AMall1.320.000.910.110.0097.6612:50:01AMall1.350.000.890.110.0097.6501:00:01AMall1.360.000.870.110.0097.6601:10:01AMall1.360.000.850.110.0097.6801:20:01AMall1.350.000.890.100.0097.6601:30:01AMall1.320.000.890.110.0097.6801:40:01AMall1.290.000.950.110.0097.6501:50:01AMall1.350.000.880.120.0097.6402:00:01AMall1.340.000.880.110.0097.6802:10:01AMall1.330.000.900.110.0097.6502:20:01AMall1.360.000.870.120.0097.6502:30:01AMall1.350.000.850.120.0097.6802:40:01AMall1.410.000.920.120.0097.5602:50:01AMall1.570.000.950.130.0097.3503:00:01AMall4.210.000.810.160.0094.8103:10:01AMall2.500.000.870.130.0096.5003:20:01AMall1.370.000.870.120.0097.6503:30:01AMall1.360.000.950.130.0097.5603:40:01AMall1.480.000.970.240.0097.3003:50:01AMall1.350.010.910.130.0097.6004:00:01AMall1.390.000.950.190.0097.4704:10:01AMall1.360.000.990.130.0097.52

注意:

sar查看性能或其日志时,使用的12/24小时制;日志的切割是昨天晚上12点到今天12点为一天;默认只保留一个月的日志

六、sar命令参数及输出项详解

【1】格式

用法:sar + 选项 + 时间间隔(可选) + 次数 (可选)

interval: 取样周期,单位是秒count:取样次数,默认值为1options:命令行选项

【2】常用选项

-A          所有报告的总和-B          输出内存页面的统计信息-b          输出I/O和传送速率的统计信息-C          输出进程统计信息及每秒创建的进程数-d          输出每一个块设备的活动信息-H          输出交换空间利用率信息-h          输出帮助信息-p          输出友好设备名字,以方便查看,常与-d和-n参数结合使用-q          输出进程队列长度和系统平均负载状态统计信息-R          输出内存页面的统计信息-r          输出内存和交换空间的统计信息-S          输出交换空间利用率信息-t          读取 /var/log/sa/下的某日志的数据时显示其中记录的原始时间-u          输出整体CPU使用情况的统计信息-V          输出版本信息-v          输出内核表状况统计信息(inode、文件和其他内核表的统计信息)-W          输出系统交换的统计信息-w          输出任务创建与系统转换统计信息-y          输出终端设备的活动信息-----------I          输出指定中断的统计信息,后方可加参数{...|SUM|ALL|XALL}  ...          指定中断号SUM          指定输出每秒接收到的中断总数ALL          指定输出前16个中断XALL        指定输出全部的中断信息-----------P          输出指定的部分的CPU的统计信息,后方可加参数{cpu|ALL}cpu          指定cpuALL          输出单个和整体cpu的统计数据-----------n          输出网络设备(网卡)状态统计信息,后方可加参数{DEV|EDEV|NFS|NFSD|SOCK|ALL}    DEV          输出网络设备的统计信息EDEV        输出网络设备的错误统计信息NFS          输出NFS客户端的活动统计信息NFSD        输出NFS服务器的活动统计信息SOCK        输出网络套接字的使用统计信息ALL          输出所有类型的网络活动统计信息-----------f          从文件中读取数据信息。一般读取sar日志,也可读取-o选项生成的文件,后方要加文件名-o          将sar的输出信息保存到文件中,后方要加文件名-i          指定间隔时长,单位为秒-s          指定输出统计数据的起始时间(格式为hh:mm:ss;例如01:00:00)  -e          指定输出统计数据的截至时间,通常与-S选项连用。无数值时默认为18:00:00(格式为hh:mm:ss;例如09:00:00)

【3】输出项

<1>cpu的输出

sar -u

%usr              CPU在用户模式下,执行进程的时间百分比 %nice              CPU在用户模式下,用于nice操作,所占用CPU总时间的百分比 %system            CPU处在系统模式(内核态)下,执行进程的时间百分比 %iowait            CPU用于等待I/O操作完成(等待输入输出完成),占用CPU总时间的百分比 %steal            管理程序为另一个虚拟进程提供服务而等待虚拟CPU的百分比%idle              CPU空闲时间百分比

注意:

如果%iowait的值过高,表示硬盘存在I/O瓶颈 如果%idle值高,表示CPU较空闲如果%idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量 如果%idle 的值持续低于10,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU

<2>I/O和传送速率输出

sar -b

tps                每秒向磁盘设备请求数据的次数,包括读、写请求,其为rtps与wtps的和。每一次IO下发后会先将多个请求合并为一个I/O磁盘请求,这里tps指请求合并后的请求计数rtps              每秒向磁盘设备的读请求次数 wtps              每秒向磁盘设备的写请求次数 bread/s            每秒钟从物理设备读入的数据量,单位为 块/s bwrtn/s            每秒钟向物理设备写入的数据量,单位为 块/s

<3>设备使用情况输出

sar -d

DEV                磁盘设备,加上用参数-p可以打印出sda等磁盘设备名称;如不加参数-p,设备则显示为dev253-0等tps                每秒向磁盘设备请求数据的次数,包括读、写请求,其为rtps与wtps的和。每一次IO下发后会先将多个请求合并为一个I/O磁盘请求,这里tps指请求合并后的请求计数rd_sec/s          每秒读扇区的次数wr_sec/s          每秒写扇区的次数avgrq-sz          平均每次设备I/O操作的数据大小(扇区)avgqu-sz          磁盘请求队列的平均长度await              从请求磁盘到系统处理完,每次请求的平均消耗时间,包括请求队列等待时间(单位是毫秒)svctm              系统处理每次请求的平均时间,不包括在请求队列中消耗的时间%util              I/O请求占CPU的百分比

<4>网络设备统计信息输出

sar -n EDEV

IFACE              网络设备名rxpck/s            每秒接收的包数量txpck/s            每秒传输的包数量rxbyt/s            每秒接收的字节数(单位为byte)txbyt/s            每秒传输的字节数(单位为byte)rxkB/s            每秒收的数据量(单位为kB)txkB/s            每秒发的数据量(单位为kB)rxcmp/s            每秒接收压缩包的数量txcmp/s            每秒传输压缩包的数量rxmcst/s          每秒接收的多播(multicast)包的总数排查网络设备故障

<5>网络设备故障信息输出

EDEV |egrep ‘eth0|IFACE’ (本次指定了网卡etho0,可填入其他网卡)

IFACE网络设备名rxerr/s每秒接收的坏包数量txerr/s传输包时每秒发生错误的数量coll/s传输包时每秒发生冲突的数量rxdrop/s接收包时,每秒丢弃的包的数量(缺乏缓存导致)txdrop/s传输包时,每秒丢弃的包的数量(缺乏缓存导致)txcarr/s传输包时,每秒发生的传输错误的数量rxfram/s接收包时,每秒发生帧校验错误的数量rxfifo/s接收包时,每秒钟缓冲区溢出错误的数量txfifo/s传输包时,每秒钟缓冲区溢出错误的数量

<6>内存分页状态输出

sar -B

pgpgin/s每秒从磁盘空间或交换空间置换到内存的字节数(单位为KB)pgpgout/s每秒从内存置换到磁盘空间或交换空间的字节数(单位为KB)fault/s每秒钟系统产生的缺页数(主缺页加次缺页)majflt/s每秒钟产生的主缺页数pgfree/s每秒被放入空闲队列中的页个数pgscank/s每秒被kswapd扫描的页个数pgscand/s每秒直接被扫描的页个数pgsteal/s每秒钟从cache中被清除来满足内存需要的页个数%vmeff每秒清除的页占总扫描页的百分比

<7>进程队列长度和平均负载状态输出

sar -q

runq-sz          运行队列的长度,等待运行的进程数量

plist-sz        进程列表中进程和线程的数量

ldavg-1          最后1分钟的系统平均负载

ldavg-5          过去5分钟的系统平均负载

ldavg-15        过去15分钟的系统平均负载

<8>内存和交换空间状态输出

sar -r

kbmemfree空闲的内存数量(单位为KB)kbmemused已使用的内存数量,不包含内核使用的内存(单位为KB)%memused已使用内存的百分数kbbuffers内核缓冲区buffer,使用的内存数量(单位为KB)kbcached内核高速缓存cache数据使用的内存数量(单位为KB)kbcommit保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap)%commitkbcommit与所有内存总量的百分比

<9>系统交换活动信息输出

sar -W

pswpin/s          每秒系统换入的交换页面数量

pswpout/s          每秒系统换出的交换页面数量

七、sar使用实例-查看某一时间段的情况

<1>查看凌晨1点到3点的cpu

sar -s 01:00:00 -e 03:00:00

<2>查看凌晨1点到3点的系统的平均负载

若要看某时间段其他性能,加上对应选项

sar -s 01:00:00 -e 03:00:00 -q

<3>查看本月3号的cpu

注意:

该操作需要去查看sar的日志(第五节已经介绍一次)

默认只保存一个月的

sar查看性能或其日志时,注意自己的使用的是12还是24小时制

日志的切割是昨天晚上12点到今天12点为一天

cd/var/log/sa/sar -f sa03

H. LINUX的SHELL脚本,有关添加和删除用户脚本

#!/bin/bash

read -p "请输入用户前缀: " A
read -p "悉此请输入删除用户起始范围: " B
read -p "请输入睁岁迅雀旦删除用户结束范围: " C

while [ $B -le $C ]
do
if [ $B -lt 10 ]
then
USE=0$B
else
USE=$B
fi
userdel $A$USE
let B++
done

I. 来解决装linux的问题

你需要有Grub for dos。启动dos,进入grub,然后使用grub引导安装。
一下是硬盘安装SUSE的参考
A:\>M:
M:\>cd grub --(假渗缺设你的grub放在M:\grub\)
M:\grub>grub
GRUB>root(hd0,0) --(指定启动漏逗磁盘和磁盘分区)
GRUB>kernel \loader\Linux vga=791 --(指定启动文件位置,并设置屏丛搜辩幕模式为791--1024*768)
GRUB>initrd \loader\initrd --(指定initrd.img位置)
GRUB>boot

J. Linux里面block代表什么意思

在2.4 的 fs/buffers.c 的函数
static int __block_prepare_write(struct inode *inode, struct page *page,
unsigned from, unsigned to, get_block_t *get_block)

中有如下代码:

if (!page->buffers)
create_empty_buffers(page, inode->i_dev, blocksize);
head = page->buffers;

bbits = inode->i_sb->s_blocksize_bits;
block = page->index << (PAGE_CACHE_SHIFT - bbits);

for(bh = head, block_start = 0; bh != head || !block_start;
block++, block_start=block_end, bh = bh->b_this_page) {
if (!bh)
BUG();
block_end = block_start+blocksize;
if (block_end <= from)
continue;
if (block_start >= to)
break;
if (!buffer_mapped(bh)) {
err = get_block(inode, block, bh, 1);
if (err)
goto out;
if (buffer_new(bh)) {
unmap_underlying_metadata(bh);
if (Page_Uptodate(page)) {
set_bit(BH_Uptodate, &bh->b_state);
continue;
}
if (block_end > to)
memset(kaddr+to, 0, block_end-to);
if (block_start < from)
memset(kaddr+block_start, 0, from-block_start);
if (block_end > to || block_start < from)
flush_dcache_page(page);
continue;
}
}

对unmap_underlying_metadata 的意义不是特别明确, 注释说是释放潜在的bh. 实现是从hash中找到bh代表的设备上, bh-->blocknr 那个块的oldbh, 如果有的话把它释放.
奇怪的是,既然是新分配的,为什么慎雹在hash中能找到? 如宏孝察果hash中本来就有, 需要蔽茄新分配吗?

/*
* We are taking a block for data and we don't want any output from any
* buffer-cache aliases starting from return from that function and
* until the moment when something will explicitly mark the buffer
* dirty (hopefully that will not happen until we will free that block ;-)
* We don't even need to mark it not-uptodate - nobody can expect
* anything from a newly allocated buffer anyway. We used to used
* unmap_buffer() for such invalidation, but that was wrong. We definitely
* don't want to mark the alias unmapped, for example - it would confuse
* anyone who might pick it with bread() afterwards...
*/

static void unmap_underlying_metadata(struct buffer_head * bh)
{
struct buffer_head *old_bh;

old_bh = get_hash_table(bh->b_dev, bh->b_blocknr, bh->b_size);
if (old_bh) {
mark_buffer_clean(old_bh);
wait_on_buffer(old_bh);
clear_bit(BH_Req, &old_bh->b_state);
/* Here we could run brelse or bforget. We use
bforget because it will try to put the buffer
in the freelist. */
__bforget(old_bh);
}
}

阅读全文

与linuxbread相关的资料

热点内容
金刚圈作品集哪本最好看 浏览:347
一部电影的女主叫翠花 浏览:199
小男孩喜欢阿姨电影 浏览:377
古装三级武侠电影 浏览:816
我们的父辈免费完整 浏览:769
台湾打真军电影 浏览:966
男男肉电影推荐. 浏览:815
asdr q-6188188 浏览:594
主角长生不老类小说 浏览:881
朱茵穿着睡衣被绑着是哪部电影 浏览:120
女主人公头发是绿色的电影 浏览:274
小说言情现代带肉半校园 浏览:813
穿越古代肉文 浏览:572
宅男影院黄色 浏览:811
都市母女兼收小说求名 浏览:524
三个富婆找鸭的电影 浏览:429
shell源程序怎么编程 浏览:212
0855影视. 浏览:443
现代minipctvb2升级 浏览:334
穿越港娱之赵雅芝 浏览:193

友情链接