小众技巧:使用Linux C中的暂停语句提高程序运行效率!
十多年建站经验, 网站设计、网站制作客户的见证与正确选择。成都创新互联提供完善的营销型网页建站明细报价表。后期开发更加便捷高效,我们致力于追求更美、更快、更规范。
在软件开发中,提高程序运行效率一直是程序员们追求的目标之一。在Linux C编程中,有许多技巧可以提高程序的运行效率,其中使用暂停语句可以说是一个小众技巧,但是却非常有效。本文将会介绍什么是暂停语句,暂停语句的实现方式,以及如何有效地将暂停语句应用于Linux C的程序开发中。
一、什么是暂停语句?
在Linux C中,暂停语句指的是通过系统调用sleep()来实现,该函数的主要作用是使当前进程暂停一段时间,让出CPU的使用权,以避免CPU的占用过度,从而达到提高程序运行效率的目的。当程序执行到sleep()函数时,程序会进入阻塞状态,等待固定的时间后再次运行。
二、暂停语句的实现方式
在Linux C编程中,实现暂停语句非常简单,只需要调用sleep()函数即可。例如,下面的示例代码展示了如何使用sleep()函数创建一个简单的暂停程序:
#include
#include
int mn()
{
printf(“Begin Pause\n”);
sleep(10);
printf(“End Pause\n”);
return 0;
}
在上面的代码中,我们调用了sleep()函数,并传递了一个参数10,表示程序暂停10秒钟。在执行到sleep()函数时,程序会睡眠10秒钟,然后打印出”End Pause”这句话。这个示例程序非常简单,但是却可以让我们清楚地看到暂停语句的实现方式。
除了使用sleep()函数之外,还有一些其他的方法可以实现暂停语句。例如,我们可以使用usleep()函数来实现微秒级的暂停操作,也可以使用nanosleep()函数来实现纳秒级的暂停操作。
三、如何有效地应用暂停语句于Linux C程序开发中
虽然暂停语句可以提高程序的运行效率,但是过度地使用暂停语句会导致程序变慢或者出现诸如卡顿等问题。因此,在Linux C程序开发中,应该合理地应用暂停语句,从而达到更好的效果。
下面是一些使用暂停语句的小技巧:
1. 合理地设置暂停时间
在Linux C编程中,应该合理地设置暂停时间,避免浪费CPU时间。如果暂停时间过短,程序可能会频繁地调用sleep()函数,从而浪费CPU时间;如果暂停时间过长,程序可能会变慢或者出现诸如”卡顿”等问题。因此,我们应该根据具体情况来确定暂停时间。
2. 避免在循环中过度使用暂停语句
在使用暂停语句时,应该避免在循环中过度使用,否则会导致程序变慢。应该仅在必要时使用暂停语句。
3. 考虑使用其他的调度机制
在某些情况下,应该考虑使用其他的调度机制,例如信号和定时器。这些机制可以实现和暂停语句类似的功能,但是更为灵活和高效。
小结
相关问题拓展阅读:
shutdown并不芦则腊会关闭socket decriptor,只是改变其工作方式盯余。而close则会释放陪滑这个socket。
假设server和client 已经建立了连接,server调用了close, 发送FIN 段给client(其实不一定会发送FIN段,后面再说),此时server不能再通过
socket发送和接收数据,此时client调用read,如果接收到FIN 段会返回0,但client此时还是可以write 给server的,write调用只负责把数据交给TCP
发送缓冲区就可以成功返回了,所以不会出错,而server收到数据后应答一个RST段,表示服务器已经不能接收数据,连接重置,client收到RST段后无
法立刻通知应用层,只把这个状态保存在TCP协议层。如果client再次调用拦枝迹write发数据给server,由于TCP协议层已经处于RST状态了,因此不会将数据
发出,而是发一个SIGPIPE信号给应用层,SIGPIPE信号的缺省处理动作是终止程序。
有时候代码中需要连续多次调用write,可能还来不及调用read得知对方已关闭了连接就被SIGPIPE信号终止掉了,这就需要在初始化时调用sigaction处
理SIGPIPE信号,对于这个信号的处理我们通常忽略即可,signal(SIGPIPE, SIG_IGN); 如果SIGPIPE信号没有导致进程异常退出,write返回-1并且
errno为EPIPE。
#include
intclose(int fd);
close 关闭了自身数据传输的两个方向。
#include
intshutdown(int sockfd, int how);
shutdown 可以选择关闭某个方向或者同时关闭两个方向,shutdownhow = 1 or how = 2 (SHUT_WR or SHUT_RDWR),可以保证对等方接收到一个EOF字符(即发送了一个FIN段),而不管其他进程是否已经打开了这个套接字。而close不能保证,只有当某个sockfd的引用计数为0,close 才会发送FIN段,否则只是将引用计数减1而已。也就是说只有当所有进程(可能fork多个子进程都打开了这个套接字)都关闭了这个套接字,close 才会发送FIN段。
所以说,如果是调用shutdown how = 1 ,则意味着往一个已经接收FIN的套接字中写是简并允许的,接收到FIN段仅代表对方不再发送数据,但对方还是可以读取数据的,可以让对方可以继续读取缓冲区剩余的数据。
下面使用shutdown 修改客户端程序,在前面讲过的使用select函数修改后的客户端程序基础上,修改很小一部分:
C++ Code
if (FD_ISSET(fd_stdin, &rset))
{
if (fgets(sendbuf, sizeof(sendbuf), stdin)== NULL)
{
stdineof = 1; //表示已经输入完毕
/* 关闭sock的写端,还能够接收数据,在sock的缓冲区末尾添加一个FIN段 */
shutdown(sock, SHUT_WR);
}
else
{
writen(sock, sendbuf, strlen(sendbuf));
memset(sendbuf, 0, sizeof(sendbuf));
}
}
为了测试我们想要的效果,需要在select函数修改后的服务器端程序的 134 行代码之后,即writen 之前 sleep(4); 目的是接收到客户端数据后搭带不马
上回射回去,睡眠4s 后在客户端已经关闭连接的情况下再发送数据。
先运行服务器端程序,再运行客户端程序,在客户端标准输入,迅速敲入两行:AAAAA\n BBBBB\n 然后按下ctrl+d 即fgets 会返回NULL,然后调用
shutdown关闭写端,虽然服务器端延时才发送数据,此时客户端写端已经关闭,但还是可以读取到回射回来的数据,服务器端最后得到一个FIN段,read
返回0,打印输出 client close ,并且close(conn); 而客户端在读取服务端回射回来的两次数据后,再次read 也返回0,故打印 server connect
close,break退出循环,进程顺利退出。从下面的输出还可以看出,因为延时的关系,所以不像以前那样发射一行就回射一行。
simba@ubuntu:~/Documents/code/linux_programming/UNP/socket$./echoser_select
recv connect ip=127.0.0.1 port=54010
fdsgfgd
gfedg
client close
………………………
simba@ubuntu:~/Documents/code/linux_programming/UNP/socket$./echocli_select_shutdown
local ip=127.0.0.1 port=54010
fdsgfgd
gfedg
fdsgfgd
gfedg
gfedg
server connect close
如果我们将客户端程序中的shutdown 改成了 close,那么当延时后服务器端发送数据给客户端时,客户端的读端和写端都已经关闭,之一次发AAAAA会
返回一个RST段,根据本文前面所说,再次发BBBBB直接产生SIGPIPE信号,默认会终止进程,但因为我们已经设置了忽略SIGPIPE信号,所以服务器端进
程不会被终止,但客户端也会出错,因为回到while循环开头,select阻塞等待时发现套接字的读端已经关闭,所以不能再关心可读事件了,select会返
回-1,错误码是 EBADF: Bad File Descriptor。
老问题了。网上有人说的挺清楚的,请百度“socket shutdown close区别”。
C=Close
Z=Pause
D=Delete
呵呵 这几个快捷键的确很相似,但是功能又不相同,简单说下:
1、Ctrl+C比较暴力,就是发送Terminal到当前搭巧的程序,比如你正在运行一个查找功能,文件正在查找中,Ctrl+C就会强制结束当前的这个进程。
2、Ctrl+Z是把当前的程序挂起,暂停执行这知滚键个程序,比如你正在mysql终端中,需要出来搞点其他的文件操作,又不想退出mysql终端(因为下次还得输入用户名密码进入,挺麻烦),于是可以ctrl+z将mysql挂起,然后进行其他操作,然后输入fg回车后就可以回来,当然可以挂起好多进程到后台,然后fg 加备洞编号就能把挂起的进程返回到前台。当然,配合bg和fg命令进行前后台切换会非常方便。
3、Ctrl+D 是发送一个exit信号,没有那么强烈,类似ctrl+C的操作,比如你从管理员root退回到你的普通用户就可以这么用。
Good Luck~~
Ctrl+C 终止一个程序的运行,如:你不想继续当前程序的运行,可以用这个命令终渣卖液止,回配键到提如物示符下。
Ctrl+Z 挂起一个当前运行的程序
Ctrl+D 退出当前的SHELL,相当于exit命令
关于linux c 暂停语句的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
成都服务器托管选创新互联,先上架开通再付费。
创新互联(www.cdcxhl.com)专业-网站建设,软件开发老牌服务商!微信小程序开发,APP开发,网站制作,网站营销推广服务众多企业。电话:028-86922220
文章题目:小众技巧:使用linux c中的暂停语句提高程序运行效率! (linux c 暂停语句)
标题来源:http://www.shufengxianlan.com/qtweb/news21/526971.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联