C库的方法高效运用——在Linux上使用std C库 (linux中使用std)

在Linux上使用std C库,可以极大地提高程序的效率和可读性。C库作为Linux操作系统的核心,包含了许多经典的函数,可以非常方便地实现各种操作。

一、输入输出函数

输入输出函数是最常用的函数之一,可用于从控制台读取用户输入,以及将数据输出到文件或控制台。

1. printf函数

printf函数是C库中最常用的输出函数之一,可以将指定的数据按照指定的格式输出到控制台或文件中。例如:

printf(“Hello World!”);

该代码将在控制台上输出Hello World!。除了输出字符串之外,printf还可以输出其他类型的数据,如整型、浮点型、字符型等。

2. scanf函数

scanf函数可以从控制台中读取用户输入的数据,并将其保存到指定的变量中。例如:

int num;

scanf(“%d”, &num);

该代码将从控制台读取一个整数,并将其保存到变量num中。

3. 文件操作函数

C库中还包含许多文件操作函数,如fopen、fclose、fread、fwrite等。这些函数可以实现对文件的读写操作。

例如,以下代码可以在控制台上打开文件并向其中写入数据:

FILE *fp;

fp = fopen(“data.txt”, “w”);

fprintf(fp, “Hello World!”);

fclose(fp);

其中,fopen函数用于打开文件,之一个参数是文件名,第二个参数是打开方式(w表示写入模式)。fprintf函数用于将数据写入文件中,关闭文件时需要调用fclose函数。

二、字符串操作函数

C库中包含了许多操作字符串的函数,如strcpy、strcat、strlen等。这些函数可以大大简化代码,提升效率。

1. strcpy函数

strcpy函数可以将一个字符串复制到另一个字符串中。例如:

char str1[] = “Hello World!”;

char str2[20];

strcpy(str2, str1);

该代码将字符串str1复制到str2中。需要注意的是,str2的大小必须足够大,以容纳str1中的所有字符。

2. strcat函数

strcat函数可以将一个字符串连接到另一个字符串的末尾。例如:

char str1[] = “Hello”;

char str2[] = “World”;

strcat(str1, str2);

该代码将字符串str2连接到字符串str1的末尾,最终结果为字符串”HelloWorld”。

3. strlen函数

strlen函数可以获取一个字符串的长度(即字符个数)。例如:

char str[] = “Hello World!”;

int len = strlen(str);

该代码将获取字符串str的长度,并将其保存到变量len中。strlen函数不会计算字符串最后的空字符(’\0’)。

三、动态内存分配函数

动态内存分配函数是C库中非常重要的函数之一,可用于在运行时动态分配内存。

1. malloc函数

malloc函数可以在运行时动态分配指定大小的内存,返回的指针可以用于访问这块内存。例如:

int *p;

p = (int *)malloc(sizeof(int));

该代码将动态分配一个整数大小的内存,并将起始地址保存在指针p中。

2. free函数

free函数可以释放动态分配的内存,让其成为可用内存池的一部分。例如:

free(p);

该代码将释放指针p所指向的内存。

四、其他常用函数

C库中还包含了许多其他常用函数,如atoi、atof、exit等。

1. atoi函数

atoi函数可以将一个字符串转换为整型数据。例如:

char str[] = “123”;

int num = atoi(str);

该代码将字符串”123″转换为整型数据,并将其保存在变量num中。

2. atof函数

atof函数可以将一个字符串转换为浮点型数据。例如:

char str[] = “3.14”;

float num = atof(str);

该代码将字符串”3.14″转换为浮点型数据,并将其保存在变量num中。

3. exit函数

exit函数可以终止当前程序的执行。例如:

exit(0);

该代码将使程序退出,并返回值0。

综上所述,在Linux上使用std C库,可以方便地实现各种操作,提高程序的效率和可读性。值得注意的是,C库中的函数有些需要特定的头文件支持,需要根据具体情况进行选择。

相关问题拓展阅读:

求解 : 在linux中 比如 fprintf(stderr,“******”);则这个函数把错误信息写到那个文件里的????

stderr 是输出到标准出错,还有类似的:标准输入和标准输出.

stderr 标准错误输出

这个函数是把错核禅误信息直接输出到终弊氏陵端,租戚即显示上与stdout一样

如何灵活运用Linux 进程资源监控和进程限制

你可以使用 mpstat 单独查看每个处理器或者系统整体的活动,可以是每次一个快照或者动态更新。启燃并

为了使用这个工具,你首先需要安装 sysstat:

# yum update && yum install sysstat

# aptitutde update && aptitude install sysstat

# zypper update && zypper install sysstat

你可以在 Linux 中学习 Sysstat 和其中的工具 mpstat、pidstat、iostat 和 sar,了解更多和 sysstat 和其中的工具相关的信息。悄迹

安装完 mpstat 之后,段晌就可以使用它生成处理器统计信息的报告。

你可以使用下面的命令每隔 2 秒显示所有 CPU(用-P ALL 表示)的 CPU 利用率(-u),共显示3次。

# mpstat -P ALL -u 2 3

示例输出:

Linux 3.19.0-32-generic (tecmint.com) Wednesday 30 March_x86_64_ (4 CPU)

11:41:07 IST CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle

11:41:09 IST all 5……….91

11:41:09 IST……….53

11:41:09 IST……….00

11:41:09 IST……….57

11:41:09 IST……….56

11:41:09 IST CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle

11:41:11 IST all 11……….66

11:41:11 IST……….50

11:41:11 IST……….68

11:41:11 IST……….50

11:41:11 IST……….60

11:41:11 IST CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle

11:41:13 IST all 5……….07

11:41:13 IST……….54

11:41:13 IST……….75

11:41:13 IST……….00

11:41:13 IST……….57

Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle

Average: all 7……….89

Average:……….87

Average:……….78

Average:……….35

Average:……….59

要查看指定的 CPU(在下面的例子中是 CPU 0),可以使用:

# mpstat -P 0 -u 2 3

示例输出:

Linux 3.19.0-32-generic (tecmint.com) Wednesday 30 March_x86_64_ (4 CPU)

11:42:08 IST CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle

11:42:10 IST……….50

11:42:12 IST……….37

11:42:14 IST……….74

Average:……….23

上面命令的输出包括这些列:

CPU: 整数表示的处理器号或者 all 表示所有处理器的平均值。

%usr: 运行在用户级别的应用的 CPU 利用率百分数。

%nice: 和 %usr相同,但有 nice 优先级。

%sys: 执行内核应用的 CPU 利用率百分比。这不包括用于处理中断或者硬件请求的时间。

%iowait: 指定(或所有)CPU 的空闲时间百分比,这表示当前 CPU 处于 I/O 操作密集的状态。

%irq: 用于处理硬件中断的时间所占百分比。

%soft: 和%irq相同,但是是软中断。

%steal: 虚拟机非自主等待(时间片窃取)所占时间的百分比,即当虚拟机在竞争 CPU 时所从虚拟机管理程序那里“赢得”的时间。应该保持这个值尽可能小。如果这个值很大,意味着虚拟机正在或者将要停止运转。

%guest: 运行虚拟处理器所用的时间百分比。

%idle: CPU 没有运行任何任务所占时间的百分比。如果你观察到这个值很小,意味着系统负载很重。在这种情况下,你需要查看详细的进程列表、以及下面将要讨论的内容来确定这是什么原因导致的。

运行下面的命令使处理器处于极高负载,然后在另一个终端执行 mpstat 命令:

# dd if=/dev/zero of=test.iso bs=1G count=1

# mpstat -u -P 0 2 3

# ping -f localhost # Interrupt with Ctrl + C after mpstat below completes

# mpstat -u -P 0 2 3

最后,和 “正常” 情况下 mpstat 的输出作比较:

正如你在上面图示中看到的,在前面两个例子中,根据%idle的值可以判断 CPU 0 负载很高。

在下一部分,我们会讨论如何识别资源饥饿型进程,如何获取更多和它们相关的信息,以及如何采取恰当的措施。

Linux 进程报告

我们可以使用有名的ps命令,用-eo选项(根据用户定义格式选中所有进程) 和–sort选项(指定自定义排序顺序)按照 CPU 使用率排序列出进程,例如:

# ps -eo pid,ppid,cmd,%cpu,%mem –sort=-%cpu

上面的命令只会显示PID、PPID、和进程相关的命令、 CPU 使用率以及 RAM 使用率,并按照 CPU 使用率降序排序。创建 .iso 文件的时候运行上面的命令,下面是输出的前面几行:

一旦我们找到了感兴趣的进程(例如PID=2822的进程),我们就可以进入/proc/PID(本例中是/proc/2822) 列出目录内容。

这个目录就是进程运行的时候保存多个关于该进程详细信息的文件和子目录的目录。

例如:

/proc/2822/io:包括该进程的 IO 统计信息(IO 操作时的读写字符数)。

/proc/2822/attr/current:显示了进程当前的 SELinux 安全属性。

/proc/2822/cgroup:如果启用了 CONFIGCGROUPS 内核设置选项,这会显示该进程所属的控制组(简称cgroups),你可以使用下面命令验证是否启用了 CONFIGCGROUPS:

# cat /boot/config-$(uname -r) | grep -i cgroups

如果启用了该选项,你应该看到:

CONFIG_CGROUPS=y

根据红帽企业版 Linux 7 资源管理指南之一到四章的内容、openSUSE 系统分析和调优指南第九章、Ubuntu 14.04 服务器文档Control Groups 章节,你可以使用cgroups管理每个进程允许使用的资源数目。

/proc/2822/fd这个目录包含每个打开的描述进程的文件的符号链接。下面的截图显示了 tty1(之一个终端) 中创建 .iso 镜像进程的相关信息:

上面的截图显示 stdin(文件描述符 0)、stdout(文件描述符 1)、stderr(文件描述符 2) 相应地被映射到 /dev/zero、 /root/test.iso 和 /dev/tty1。

在 Linux 中为每个用户设置资源限制

如果你不够小心、让任意用户使用不受限制的进程数,最终你可能会遇到意外的系统关机或者由于系统进入不可用的状态而被锁住。为了防止这种情况发生,你应该为用户可以启动的进程数目设置上限。

你可以在 /etc/security/limits.conf 文件末尾添加下面一行来设置限制:* hard nproc 10

之一个字段可以用来表示一个用户、组或者所有人(*), 第二个字段强制限制可以使用的进程数目(nproc) 为 10。退出并重新登录就可以使设置生效。

然后,让我们来看看非 root 用户(合法用户或非法用户) 试图引起 shell fork 炸弹时会发生什么。如果我们没有设置限制, shell fork 炸弹会无限制地启动函数的两个实例,然后无限循环地复制任意一个实例。最终导致你的系统卡死。

但是,如果使用了上面的限制,fort 炸弹就不会成功,但用户仍然会被锁在外面直到系统管理员杀死相关的进程。

提示:limits.conf文件中可以查看其它 ulimit 可以更改的限制。

其它 Linux 进程管理工具

除了上面讨论的工具, 一个系统管理员还可能需要:

a) 通过使用 renice 调整执行优先级(系统资源的使用)。这意味着内核会根据分配的优先级(众所周知的 “niceness”,它是一个范围从-20到19的整数)给进程分配更多或更少的系统资源。

这个值越小,执行优先级越高。普通用户(而非 root)只能调高他们所有的进程的 niceness 值(意味着更低的优先级),而 root 用户可以调高或调低任何进程的 niceness 值。

renice 命令的基本语法如下:

# renice identifier

如果 new priority 后面的参数没有(为空),默认就是 PID。在这种情况下,PID=identifier 的进程的 niceness 值会被设置为

b) 需要的时候中断一个进程的正常执行。这也就是通常所说的“杀死”进程。实质上,这意味着给进程发送一个信号使它恰当地结束运行并以有序的方式释放任何占用的资源。

按照下面的方式使用 kill 命令杀死进程:

# kill PID

另外,你也可以使用pkill结束指定用户(-u)、指定组(-G), 甚至有共同的父进程 ID (-P)的所有进程。这些选项后面可以使用数字或者名称表示的标识符。

# pkill identifier

例如:

杀死组GID=1000的所有进程.

# pkill -G 1000

杀死PPID 是 4993的所有进程.

# pkill -P 4993

在运行pkill之前,先用pgrep测试结果、或者使用-l选项列出进程名称是一个很好的办法。它需要和pkill相同的参数、但是只会返回进程的 PID(而不会有其它操作),而pkill会杀死进程。

linux中使用std的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux中使用std,C库的方法高效运用——在Linux上使用std C库,求解 : 在linux中 比如 fprintf(stderr,“******”);则这个函数把错误信息写到那个文件里的????,如何灵活运用Linux 进程资源监控和进程限制的信息别忘了在本站进行查找喔。


数据运维技术 » C库的方法高效运用——在Linux上使用std C库 (linux中使用std)