在Linux程序设计中,sleep函数是一种非常重要的函数。它可以用来暂停程序的执行,而不会让程序退出。本文将会深入了解Linux程序设计中的C语言sleep函数。
1. 理解sleep函数的概念
sleep函数用于让程序等待一定的时间后再执行下一步操作。在程序中,经常需要控制程序的执行速度,或者需要在执行过程中暂停一下程序的运行。此时,sleep函数就可以派上用场了。
2. sleep函数的功能
sleep函数的功能非常简单,就是让程序等待一定的时间后再继续往下执行。在C语言中,使用的是头文件下的函数声明,函数原型如下所示:
unsigned int sleep(unsigned int seconds);
其中,参数seconds指定了等待的秒数。具体而言,sleep函数会让当前线程等待指定的秒数,然后再继续执行下一步操作。如果seconds为0,那么该函数什么也不会做。如果seconds大于0,那么该函数会导致线程阻塞,直到等待的时间到了为止。
3. 注意事项
在使用sleep函数时需要注意以下几点:
(1)sleep函数是不可移植的,不同的操作系统实现的sleep函数可能有所不同。
(2)在某些操作系统中,sleep函数可能会被信号中断,这种情况下该函数会立即返回。
(3)当调用sleep函数时,如果被中断了,则会返回剩余的时间,此时可以再次调用sleep函数。
4. 示例代码
下面是一个简单的示例代码,用来演示如何使用sleep函数:
printf(“i = %d\n”, i);
printf(“j = %d\n”, j);
在这个例子中,程序打印出了10个i和5个j。每个j的打印之间间隔了1秒钟。可以通过改变sleep函数的参数来改变程序的输出效果。
相关问题拓展阅读:
在linux环境下c语言中如何让while循环执行固定的时间如200毫秒
linux不是实时系统,含毕一般不能准确的定时。
另外 sleep 在Windows下的单位是毫秒,而linux下单位是秒,而且好像有大小写区别。
要睡眠200毫秒的话,可以用nanosleep,单衡老虚位是咐燃纳秒。
楼上的想让你的程序变成悲剧…linux下sleep函数的参数是秒为单位的…休眠200秒…
睡眠灶弯答小于1秒用usleep,单位是毫秒…
所以,楼上的程序把sleep改成usleep就隐慧可以 了…
/* any thing you want to do*/
usleep(200);
另外我觉得你要说的好像是:希望while循环执行某些操作,执行时间到200毫秒之后退出while循环?
最简单是用间隔定时器…
你查下这几个函数:timer_create,timer_settime等。
时间设置比较精确,可以设置一段时间间隔,过了闹握指定的时间之后,会给当前进程发送一个SIGALRM信号,你while循环的条件,可以在SIGALRM的信号处理函数里面修改,这样,到时间之后while就可以退出了….
这样写:
static char flag=1
int main(void)
signal(SIGALRM, timer_handler);
申请并且设置间隔定时器的间隔
while(flag)
/*循环内的操作*/
void timer_handler(unsigned int signal)
例如下面的是从1加到100:
int i,sum=0;
while(i100时,结束循环。
相当于:
{ sum=sum+i;
我也初学,前天看到这里.呵呵
/庆散* any thing you want to do*/
sleep(200);
windows 和 linux 都有sleep函数誉余氏,你自己查询一下毁粗。
usleep(200);
Linux C语言用system()调用,带参数
格式:
system(字符串)
例如:
char my_cmd1=”ls -l”;
char my_cmd2=”ls -l > abc.txt”;
char my_cmd3=”simser.exe 67″;
system(my_cmd1);
system(my_cmd2);
system(my_cmd3);
simser.exe 67
67 是位扮磨慧厅答置参数才可以这样写。(也就是 通过游肆 simser.exe 的
main(int argc, char *argv) argv 传入的)
system(“simser”,”67″); — wrong, system takes one parameter only.
linux c system函数介绍:
system(执行shell 命令)
相关函数
Fork,execve,waitpid,popen
表头文件
定义函数
int system(const char * string);
函数说明
system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命>令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。
返回值
=-1:出现错误
=0:调用成功但是没有出现子进程
>0:成功退出的子进程的id
如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值>。如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为 system()调用/bin/sh失败所返回的127,因此更好能再检查errno 来确认执行成功。
附加说明
在编写具有SUID/SGID权限的程序时请勿使用system(),system()会继承环境变量,通过环境变量可能会造成系统安全的问题握猜。
范例
system(“ls -al /etc/passwd /etc/shadow”);
执行结果:
-rw-r–r– 1 root root 705 Sep 3 13 :52 /etc/passwd
-rroot root 572 Sep 2 15 :34 /etc/shado
例2:
sprintf(tmp,”/bin/mount -t vfat %s /mnt/u”,dev);
system(tmp);
其中dev是/dev/sda1。
system函数的源码
int system(const char * cmdstring)
int status;
if(cmdstring == NULL){
return (1);
if((pid = fork())
status = -1;
else if(pid = 0){
execl(“/bin/sh”, “sh”, “-c”, cmdstring, (char *)0);
-exit(127); //子进程正常执行则不会执行此语句禅皮肢

while(waitpid(pid, &status, 0)
if(errno != EINTER)
status = -1;
return status;
那么如何获得system的返回值呢??
char * ps=”ps -ef|grep -c root”;
if((ptr = popen(ps, “r”)) != NULL)
fgets(buf, 10 , ptr);
i = atoi(buf);
pclose(ptr);
可以man下waitpid查看下如何检查status的值
int ret = system(“ls -al /etc/passwd /etc/shadow”);
if(WIFSIGNALED(ret))
linux C语言编程 唤醒指定PID的进程
这样应该可以:
kill(cpid, SIGUSR1);
给你并物一个完整的测试代码:
void handler(int signo)
printf(“recv the signal from parent process\n”);
pid = fork();
switch(pid)
perror(“fork failed”);
printf(“in the child\搜顷n”);
signal(SIGCONT, handler);
printf(“child weakup\n”);
printf(“in the parent\n”);
kill(pid, SIGCONT);
printf(“parent weakup\n”);
printf(“bye..\n”);
运行及绝漏液输出:
beyes@linux-beyes:~/C> ./weakup.exe
in the child
in the parent
recv the signal from parent process
child weakup
parent weakup
用kill函数给这个进程粗逗发一个信号。
int kill(pid_t pid, int sig);
关于linux c语言sleep函数的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
香港服务器首选树叶云,2H2G首月10元开通。树叶云(shuyeidc.com)提供简单好用,价格厚道的香港/美国云 服务器 和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。
linux 编程问题 在主进程中创建2个子进程,一个用exec函数,一个用fork
编写一段程序,使用系统调用fork( )创建两个子进程。 当此程序运行时,在系统中有一个父进程和两个子进程活动。 让每一个进程在屏幕上显示一个字符;父进程显示字符“a”,子进程分别显示字符“b”和“c”。 试观察记录屏幕上的显示结果,并分析原因。 〈程序〉 #include main() { int p1,p2; if(p1=fork()) /*子进程创建成功*/ putchar(b); else { if(p2=fork()) /*子进程创建成功*/ putchar(c); else putchar(a); /*父进程执行*/ } } bca(有时会出现abc的任意的排列) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 编制一段程序,实现进程的管道通信。 使用系统调用pipe()建立一条管道线。 两个子进程p1和p2分别向通道个写一句话: child1 process is sending message! child2 process is sending message! 而父进程则从管道中读出来自两个进程的信息,显示在屏幕上。 〈程序〉 #include #include #include int pid1,pid2; main( ) { int fd[2]; char outpipe[100],inpipe[100]; pipe(fd); /*创建一个管道*/ while ((pid1=fork( ))==-1); if(pid1==0) { lockf(fd[1],1,0); sprintf(outpipe,child 1 process is sending message!); /*把串放入数组outpipe中*/ write(fd[1],outpipe,50); /*向管道写长为50字节的串*/ sleep(5); /*自我阻塞5秒*/ lockf(fd[1],0,0); exit(0); } else { while((pid2=fork( ))==-1); if(pid2==0) { lockf(fd[1],1,0); /*互斥*/ sprintf(outpipe,child 2 process is sending message!); write(fd[1],outpipe,50); sleep(5); lockf(fd[1],0,0); exit(0); } else { wait(0); /*同步*/ read(fd[0],inpipe,50); /*从管道中读长为50字节的串*/ printf(%s\n,inpipe); wait(0); read(fd[0],inpipe,50); printf(%s\n,inpipe); exit(0); } } } 〈运行结果〉延迟5秒后显示: child1 process is sending message! 再延迟5秒: child2 process is sending message! 附:我承认我是复制的 不过很符合题意~
如何在 Linux 下检测内存泄漏
内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。 内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。 可以使用相应的软件测试工具对软件进行检测。 1. ccmalloc-Linux和Solaris下对C和C++程序的简单的使用内存泄漏和malloc调试库。 2. Dmalloc-Debug Malloc Library.3. Electric Fence-Linux分发版中由Bruce Perens编写的malloc()调试库。 4. Leaky-Linux下检测内存泄漏的程序。 5. LeakTracer-Linux、Solaris和HP-UX下跟踪和分析C++程序中的内存泄漏。 6. MEMWATCH-由Johan Lindh编写,是一个开放源代码C语言内存错误检测工具,主要是通过gcc的precessor来进行。 7. Valgrind-Debugging and profiling Linux programs, aiming at programs written in C and C++.8. KCachegrind-A visualization tool for the profiling data generated by Cachegrind and Calltree.9. Leak Monitor-一个Firefox扩展,能找出跟Firefox相关的泄漏类型。 10. IE Leak Detector (Drip/IE Sieve)-Drip和IE Sieve leak detectors帮助网页开发员提升动态网页性能通过报告可避免的因为IE局限的内存泄漏。 11. Windows Leaks Detector-探测任何Win32应用程序中的任何资源泄漏(内存,句柄等),基于Win API调用钩子。 12. SAP Memory Analyzer-是一款开源的JAVA内存分析软件,可用于辅助查找JAVA程序的内存泄漏,能容易找到大块内存并验证谁在一直占用它,它是基于Eclipse RCP(Rich Client Platform),可以下载RCP的独立版本或者Eclipse的插件。 13. DTrace-即动态跟踪Dynamic Tracing,是一款开源软件,能在Unix类似平台运行,用户能够动态检测操作系统内核和用户进程,以更精确地掌握系统的资源使用状况,提高系统性能,减少支持成本,并进行有效的调节。 14. IBM Rational PurifyPlus-帮助开发人员查明C/C++、托管、Java和VB6代码中的性能和可靠性错误。 PurifyPlus 将内存错误和泄漏检测、应用程序性能描述、代码覆盖分析等功能组合在一个单一、完整的工具包中。 15. Parasoft Insure++-针对C/C++应用的运行时错误自动检测工具,它能够自动监测C/C++程序,发现其中存在着的内存破坏、内存泄漏、指针错误和I/O等错误。 并通过使用一系列独特的技术(SCI技术和变异测试等),彻底的检查和测试我们的代码,精确定位错误的准确位置并给出详细的诊断信息。 能作为Microsoft Visual C++的一个插件运行。 16. Compuware DevPartner for Visual C++ BoundsChecker Suite-为C++开发者设计的运行错误检测和调试工具软件。 作为Microsoft Visual Studio和C++ 6.0的一个插件运行。 17. Electric Software GlowCode-包括内存泄漏检查,code profiler,函数调用跟踪等功能。 给C++和开发者提供完整的错误诊断,和运行时性能分析工具包。 18. Compuware DevPartner Java Edition-包含Java内存检测,代码覆盖率测试,代码性能测试,线程死锁,分布式应用等几大功能模块。 19. Quest JProbe-分析Java的内存泄漏。 20. ej-technologies JProfiler-一个全功能的Java剖析工具,专用于分析J2SE和J2EE应用程序。 它把CPU、执行绪和内存的剖析组合在一个强大的应用中。 JProfiler可提供许多IDE整合和应用服务器整合用途。 JProfiler直觉式的GUI让你可以找到效能瓶颈、抓出内存泄漏、并解决执行绪的问题。 4.3.2注册码:A-G666#F-1olm9mv1i5uuly#. BEA JRockit-用来诊断Java内存泄漏并指出根本原因,专门针对Intel平台并得到优化,能在Intel硬件上获得最高的性能。 22. SciTech Software AB Memory Profiler-找到内存泄漏并优化内存使用针对C#,,或其它程序。 23. YourKit & Java Profiler-业界领先的Java和程序性能分析工具。 24. AutomatedQA AQTime-AutomatedQA的获奖产品performance profiling和memory debugging工具集的下一代替换产品,支持Microsoft, Borland, Intel, Compaq 和 GNU编译器。 可以为和Windows程序生成全面细致的报告,从而帮助您轻松隔离并排除代码中含有的性能问题和内存/资源泄露问题。 支持 1.0,1.1,2.0,3.0和Windows 32/64位应用程序。 25. JavaScript Memory Leak Detector-微软全球产品开发欧洲团队(Global Product Development- Europe team, GPDE) 发布的一款调试工具,用来探测JavaScript代码中的内存泄漏,运行为IE系列的一个插件。
Linux下编程有什么优势
0. Linux 是用 C 写的,你读的就是 C 语言写成的代码,这些代码编译之后成了 Linux 内核。 不过因为内核几乎得自己靠自己,你多半是看不到什么外部的函数了(当然,有种科技叫做静态编译,不保证 Linux 内核没去用,我可懒得读 Makefile)。 1. Linux 一方面好改(驱动就是比 BSD 多),另一方面允许狂改(GPL v2),还比较耐艹。 不用 Linux 用别的有时候还真难,更别说 Linux 不要钱了。 2. Linux 只是个平台,理论上说和别的系统没什么两样,只不过和 Windows 比少了反斜杠路径又多了 UNIX 的美味,和 OS X 比少了各种签名的痛苦又多了几个会叫你 Google 一下就知道了的程序员……(题主要的是优点我就只说优点吧)C 的话的确是 UNIX 和类 UNIX 世界的传统主力,不过什么 Java C# nodejs PHP Python 也都有人用在 Linux 上用得很爽啊……(因为 Linux 某些方面好开发,新语言也很多都是 Linux 优先支持的。 类似地,一些内核支持让某些程序/语言在 Linux 上有特殊优势。 )3. 你要给 Linux 写东西,看内核是不够或者没用的(源代码什么的还总是要特别去看的话某些平台的程序员早就…)你需要摸清自己需要什么,然后去找对应的库,接下来学会拼起来(看你妹的源码,有库文档看还是看文档啊)……你要修改 Linux,在内核的编译选项菜单里面那一堆基本够用,并且外围软件你更可以自己裁剪啊……当然要是题主是内核裁减巨巨那当我没说。 // GNU 狂魔模式Linux 只是个内核,一个特性多到处用的内核,而它上面的程序和程序需要的库,又要从别的代码编译。 这些代码里面有个来源是大头,它就是 GNU,类 UNIX 世界自由的灯塔……GNU 的信徒(啊呸)们让 GNU 和不少其他人智慧的代码(包括我们的 Linux)一同工作,好让这些代码显示出他们各自的名字:Redhat, Bug List
发表评论