❶ linux中的进程问题,以及exit(0); 和sleep(5);
俺跟你解释一下:
fork是一个跟当前进程一模一样的进程,包括当前进程的所有状态(有特殊设置就不会拷贝,如文件标识)。子进程如果不设置新的执行程序,会继续执行fork之后的代码,注意前面提过的跟父进程一模一样的代码。
pid==0代表是子进程,因此子进程会执行这段代码:
if(pid==0)
{
printf("child!!! ");
//这里会造成子进程的主线程,main执行线程,阻塞5秒
sleep(5);
exit(0);
}
pid > 0 代表是父进程,因此父进程继续执行的代码为:
if(pid>0)
{
//此处必须等待子进程结束,子进程调用exit(0),时会通知父进程继续执行
//属于进程间通讯、同步的一个手段之一。那子进程等待5秒被唤醒,执行exit(0)
//父进程收到通知,获取到子进程的退出状态,继续就会printf,基本也就是等待了5秒
//然后父进程return0等价于exit(0)正常结束
wait(NULL);//不这样写,父进程直接结束可能会产生僵尸进程,也可能变成孤儿进程由
//由init进程领养,并正确结束。通用的做法必须wait。根据操作系统以及版本不同处理
//方式可能不一样,如aix可能就会有僵尸进程产生
printf("father!!! ");
}
❷ linux下main()中新建一个线程,延时问题
你对sleep可能有些误解,sleep本身就是使进程睡眠,睡眠的线程不会去占用CPU的。对于一个正在运行的线程来说,他最主要占用的资源就是CPU运行时间和内存。既然SLEEP使其放弃对CPU的进程权限(意思是这段时间内,他不会到CPU执行,如果想了解原因和具体实现可以参考linux内核代码对sleep的实现),那你不想让他占用资源意思就是说:不想让它占内存喽??
从定义角度来说,线程不拥有内存资源(从内核中可以查到fork和vfork创建的都是线程,他们都不会新分配内存空间,而是和父进程共享内存空间),所以说你已经没有什么可以释放了。如果还不明白,可以发信息给我。
或许你更希望做的是,压根就不启动这个线程,而是一个小时后启动。因为你没有办法然main主线程1小时后启动这个线程,因为你把握不好时间,那我可以建议你考虑下linux守护线程cron,这个可以达到你1小时后启动的目的。
❸ 嵌入式 linux下sleep函数到底是线程休眠还是进程休眠
Linux实际上没有真正复线程制的概念,pthread库中的“线程”被许多人称作“轻量级的进程",内核负责调度所有的进程,且在内核眼里被我们看做线程的东西与普通进程是无差别的。
sleep函数休眠的是当前进程,而pthread库中的“线程”事实上就是进程,因此该函数的作用域就是这个“线程”。
❹ 在linux下,想用sleep函数实现延时五秒,应该怎么设参数
使用权限 : 所有使用者
使用方式 : sleep [--help] [--version] number[smhd]
说明 : sleep 可以用来将目前动作延迟一段时间
参数说明 :
--help : 显示辅助讯息
--version : 显示版本编号
number : 时间长度,后面可接 s、m、h 或 d
其中 s 为秒,m 为 分钟,h 为小时,d 为日数
例子 :
显示目前时间后延迟 1 分钟,之后再次显示时间 :
date;sleep 1m;date
这个命令更多应用于shell脚本编程里和程序里
如下面的一段程序:
应用程序:
复制代码
代码如下:
#include <syswait.h>
usleep(n) //n微秒
Sleep(n)//n毫秒
sleep(n)//n秒
驱动程序:
#include <linux/delay.h>
mdelay(n) //milliseconds 其实现
#ifdef notdef
#define mdelay(n) (\
{unsigned long msec=(n); while (msec--) udelay(1000);})
#else
#define mdelay(n) (\
(__builtin_constant_p(n) && (n)<=MAX_UDELAY_MS) ? udelay((n)*1000) : \
({unsigned long msec=(n); while (msec--) udelay(1000);}))
#endif
调用asm/delay.h的udelay,udelay应该是纳秒级的延时
Dos:
sleep(1); //停留1秒
delay(100); //停留100毫秒
Windows:
Sleep(100); //停留100毫秒
Linux:
sleep(1); //停留1秒
usleep(1000); //停留1毫秒
每一个平台不太一样,最好自己定义一套跨平台的宏进行控制
秒还是微秒?关于延时函数sleep()
因为要写一段代码,需要用到sleep()函数,在我印象中,sleep(10)好像是休眠10微秒,结果却是休眠了10秒(在Linux下)。觉得很奇怪,因为头儿也记得好像是微秒为单位的。所以就查了一下。
原来linux下的sleep函数原型为:
unsigned int sleep(unsigned int seconds);
而MFC中的Sleep函数原型为:
void Sleep(DWORD dwMilliseconds);
也就是说,Linux下(使用的gcc的库),sleep()函数是以秒为单位的,sleep(1);就是休眠1秒。而MFC下的sleep()函数是以微秒为单位的,sleep(1000);才是休眠1秒。原来如此啊。而如果在Linux下也用微妙为单位休眠,可以使用线程休眠函数:void usleep(unsigned long usec);当然,使用的时候别忘记#include <system.h>哦。
另外值得一提的是,linux下还有个delay()函数,原型为extern void delay(unsigned int msec);它可以延时msec*4毫秒,也就是如果想延时一秒钟的话,可以这么用 delay(250);
❺ 请教Linux下的sleep函数
函数名: sleep、usleep
功 能: 执行挂起一段时间
头文件: #include <unistd.h>
区 别: unsigned sleep (unsigned int seconds);//n秒
int usleep (useconds_t usec);//n微秒
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
#include<unistd.h>
int main()
{
int sec = 0,
usec = 0;
while(1)
{
printf("sec = %d \n",++sec);
sleep(1);
printf("usec = %d \n",++usec);
usleep(1000000);
}
return 0;
}
Linux下的sleep函数原型为:
unsigned int sleep(unsigned int seconds);
而MFC中的Sleep函数原型为:
void Sleep(DWORD dwMilliseconds);
也就是说,Linux下(使用的gcc的库),sleep()函数是以秒为单位的,sleep(1);就是休眠1秒。而MFC下的Sleep()函数是以毫秒为单位的,sleep(1000);才是休眠1秒。而如果在Linux下也用微妙为单位休眠,可以使用线程休眠函数:void usleep(unsigned long usec)。
Linux下还有个delay()函数,原型为extern void delay(unsigned int msec);它可以延时msec*4毫秒,也就是如果想延时一秒钟的话,可以这么用 delay(250)。