??xml version="1.0" encoding="utf-8" standalone="yes"?>av国产在线观看,国产精品第2页,国产精品久久久免费 http://www.aygfsteel.com/fhtdy2004/category/39672.html有些?明明知道不会有结果,有些?明明知道注定会错q?/description>zh-cn Sun, 09 Aug 2009 01:27:31 GMT Sun, 09 Aug 2009 01:27:31 GMT 60 PosixU程~程指南(5)杂项 http://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286023.htmlFrank_Fang Frank_Fang Thu, 09 Jul 2009 02:07:00 GMT http://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286023.html http://www.aygfsteel.com/fhtdy2004/comments/286023.html http://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286023.html#Feedback 0 http://www.aygfsteel.com/fhtdy2004/comments/commentRss/286023.html http://www.aygfsteel.com/fhtdy2004/services/trackbacks/286023.html ]]>PosixU程~程指南(4) http://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286022.htmlFrank_Fang Frank_Fang Thu, 09 Jul 2009 02:06:00 GMT http://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286022.html http://www.aygfsteel.com/fhtdy2004/comments/286022.html http://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286022.html#Feedback 0 http://www.aygfsteel.com/fhtdy2004/comments/commentRss/286022.html http://www.aygfsteel.com/fhtdy2004/services/trackbacks/286022.html ]]>PosixU程~程指南(3)U程同步【{?/title> http://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286021.htmlFrank_Fang Frank_Fang Thu, 09 Jul 2009 02:04:00 GMT http://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286021.html http://www.aygfsteel.com/fhtdy2004/comments/286021.html http://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286021.html#Feedback 0 http://www.aygfsteel.com/fhtdy2004/comments/commentRss/286021.html http://www.aygfsteel.com/fhtdy2004/services/trackbacks/286021.html ]]> PosixU程~程指南(2)U程U有数据【{?/title> http://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286020.htmlFrank_Fang Frank_Fang Thu, 09 Jul 2009 02:03:00 GMT http://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286020.html http://www.aygfsteel.com/fhtdy2004/comments/286020.html http://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286020.html#Feedback 0 http://www.aygfsteel.com/fhtdy2004/comments/commentRss/286020.html http://www.aygfsteel.com/fhtdy2004/services/trackbacks/286020.html
q个U程U有数据在Java中与ThreadLocalcȝ作用相同,使用上也cMQ?br />
关于ThreadLocalcȝ使用参考本博中http://www.aygfsteel.com/fhtdy2004/archive/2009/06/02/279582.html
现在感觉一个东西学透彻了,有些东西学v来会很快Q基很重?/font>
]]> PosixU程~程指南(1)U程创徏与取消【{?/title> http://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286011.htmlFrank_Fang Frank_Fang Thu, 09 Jul 2009 01:48:00 GMT http://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286011.html http://www.aygfsteel.com/fhtdy2004/comments/286011.html http://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286011.html#Feedback 0 http://www.aygfsteel.com/fhtdy2004/comments/commentRss/286011.html http://www.aygfsteel.com/fhtdy2004/services/trackbacks/286011.html
]]> voidcd和void *指针cdQ网上摘抄ȝQ【{?/title> http://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286004.htmlFrank_Fang Frank_Fang Thu, 09 Jul 2009 01:12:00 GMT http://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286004.html http://www.aygfsteel.com/fhtdy2004/comments/286004.html http://www.aygfsteel.com/fhtdy2004/archive/2009/07/09/286004.html#Feedback 0 http://www.aygfsteel.com/fhtdy2004/comments/commentRss/286004.html http://www.aygfsteel.com/fhtdy2004/services/trackbacks/286004.html 现在在学linux~程q程中遇到很多void *指针cdQ由于c很早学的有些l节不甚了解Q就查了查,在C++中很用void *指针cd的?没注意过
1.概述
许多初学者对C/C++语言中的void及void指针cd不甚理解Q因此在使用上出C一些错误。本文将对void关键字的深刻含义q行解说Qƈ
详述void及void指针cd的用方法与技巧?/p>
2.void的含?/strong>
void的字面意思是“无类?#8221;Q?strong>void *则ؓ“无类型指?#8221;Qvoid *可以指向Mcd的数据?/strong>
void几乎只有“注释”和限制程序的作用Q因Z来没有h会定义一个void变量Q让我们试着来定义:
void a;
q行语句~译时会出错Q提C?#8220;illegal use of type 'void'”。不q,即void a的编译不会出错,它也没有M实际意义?/p>
void真正发挥的作用在于:
Q?Q?对函数返回的限定Q?br />
Q?Q?对函数参数的限定?/p>
我们在W三节对以上二点q行具体说明?/p>
众所周知Q如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋|如果p1和p2指向不同的数据类型,则必M用强制类?/p>
转换q算W把赋D符双的指针类型{换ؓ左边指针的类型?/p>
例如Q?br />
float *p1;
int *p2;
p1 = p2;
其中p1 = p2语句会编译出错,提示“'=' : cannot convert from 'int *' to 'float *'”Q必L为:
p1 = (float *)p2;
而void *则不同,Mcd的指针都可以直接赋值给它,无需q行强制cd转换Q?br />
void *p1;
int *p2;
p1 = p2;
但这q不意味着Qvoid *也可以无需强制cd转换地赋l其它类型的指针。因?#8220;无类?#8221;可以包容“有类?#8221;Q?#8220;有类?#8221;则不能包
?#8220;无类?#8221;。道理很单,我们可以?#8220;男h和女人都是h”Q但不能?#8220;人是男h”或?#8220;人是女h”。下面的语句~译出错Q?br />
void *p1;
int *p2;
p2 = p1;
提示“'=' : cannot convert from 'void *' to 'int *'”?/p>
3.void的?/strong>
下面l出void关键字的使用规则Q?br />
规则一 如果函数没有q回|那么应声明ؓvoidcd
在C语言中,凡不加返回值类型限定的函数Q就会被~译器作回整型值处理。但是许多程序员却误以ؓ其ؓvoidcd。例如:
add ( int a, int b )
{
return a + b;
}
int main(int argc, char* argv[])
{
printf ( "2 + 3 = %d", add ( 2, 3) );
}
E序q行的结果ؓ输出Q?br />
2 + 3 = 5
q说明不加返回D明的函数的确为int函数?/p>
林锐博士《高质量C/C++~程》中提到Q?#8220;C++语言有很严格的类型安全检查,不允怸q情况(指函C加类型声明)发生”。可是编?/p>
器ƈ不一定这么认定,譬如在Visual C++6.0中上qadd函数的编译无错也无警告且q行正确Q所以不能寄希望于编译器会做严格的类型检查?/p>
因此Qؓ了避免乱,我们在编写C/C++E序Ӟ对于M函数都必M个不漏地指定其类型。如果函数没有返回|一定要声明为voidc?/p>
型。这既是E序良好可读性的需要,也是~程规范性的要求。另外,加上voidcd声明后,也可以发挥代码的“自注?#8221;作用。代码的“自注
?#8221;即代码能自己注释自己?/p>
规则?如果函数无参?那么应声明其参数为void
在C++语言中声明一个这L函数Q?br />
int function(void)
{
return 1;
}
则进行下面的调用是不合法的:
function(2);
因ؓ在C++中,函数参数为void的意思是q个函数不接受Q何参数?/p>
我们在Turbo C 2.0中编译:
#include "stdio.h"
fun()
{
return 1;
}
main()
{
printf("%d",fun(2));
getchar();
}
~译正确且输?Q这说明Q在C语言中,可以l无参数的函C送Q意类型的参数Q但是在C++~译器中~译同样的代码则会出错。在C++
中,不能向无参数的函C送Q何参敎ͼ出错提示“'fun' : function does not take 1 parameters”?/p>
所以,无论在Cq是C++中,若函C接受M参数Q一定要指明参数为void。至我很少q样用。?/p>
规则?心使用void指针cd
按照ANSI(American National Standards Institute)标准Q不能对void指针q行法操作Q即下列操作都是不合法的Q?br />
void * pvoid;
pvoid++; //ANSIQ错?br />
pvoid += 1; //ANSIQ错?br />
//ANSI标准之所以这栯定,是因为它坚持Q进行算法操作的指针必须是确定知道其指向数据cd大小的?br />
//例如Q?br />
int *pint;
pint++; //ANSIQ正?/p>
pint++的结果是使其增大sizeof(int)?/p>
但是大名鼎鼎的GNU(GNU's Not Unix的羃?则不q么认定Q它指定void *的算法操作与char *一致?/p>
因此下列语句在GNU~译器中皆正:
pvoid++; //GNUQ正?br />
pvoid += 1; //GNUQ正?/p>
pvoid++的执行结果是其增大了1?/p>
在实际的E序设计中,合ANSI标准Qƈ提高E序的可UL性,我们可以q样~写实现同样功能的代码:
void * pvoid;
(char *)pvoid++; //ANSIQ正;GNUQ正?br />
(char *)pvoid += 1; //ANSIQ错误;GNUQ正?/p>
GNU和ANSIq有一些区别,M而言QGNU较ANSI?#8220;开?#8221;Q提供了Ҏ多语法的支持。但是我们在真实设计Ӟq是应该可能地q合
ANSI标准?/p>
规则?如果函数的参数可以是Lcd指针Q那么应声明其参Cؓvoid *
典型的如内存操作函数memcpy和memset的函数原型分别ؓQ?br />
void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );
q样QQ何类型的指针都可以传入memcpy和memset中,q也真实CC内存操作函数的意义,因ؓ它操作的对象仅仅是一片内存,而不
片内存是什么类型。如果memcpy和memset的参数类型不是void *Q而是char *Q那才叫真的奇怪了Q这Lmemcpy和memset明显不是一?/p>
“Ua的,q低味?#8221;函数Q?/p>
下面的代码执行正:
//CZQmemset接受Lcd指针
int intarray[100];
memset ( intarray, 0, 100*sizeof(int) ); //intarray?
//CZQmemcpy接受Lcd指针
int intarray1[100], intarray2[100];
memcpy ( intarray1, intarray2, 100*sizeof(int) ); //intarray2拯lintarray1
有趣的是Qmemcpy和memset函数q回的也是void *cdQ标准库函数的编写者是多么地富有学问啊Q?/p>
规则?void不能代表一个真实的变量
下面代码都企图让void代表一个真实的变量Q因此都是错误的代码Q?br />
void a; //错误
function(void a); //错误
void体现了一U抽象,q个世界上的变量都是“有类?#8221;的,譬如一个h不是男h是女hQ还有h妖?Q?/p>
void的出现只是ؓ了一U抽象的需要,如果你正地理解了面向对象中“抽象基类”的概念,也很Ҏ理解void数据cd。正如不能给?/p>
象基cd义一个实例,我们也不能定义一个voidQ让我们cL的称void?#8220;抽象数据cd”Q变量?/p>
4.ȝ
小的void蕴藏着很丰富的设计哲学Q作Z名程序设计h员,寚w题进行深一个层ơ的思考必然我们受益匪浅?br />
]]>U程同步Q何时互斥锁不够Q还需要条件变? http://www.aygfsteel.com/fhtdy2004/archive/2009/07/05/285519.htmlFrank_Fang Frank_Fang Sat, 04 Jul 2009 17:07:00 GMT http://www.aygfsteel.com/fhtdy2004/archive/2009/07/05/285519.html http://www.aygfsteel.com/fhtdy2004/comments/285519.html http://www.aygfsteel.com/fhtdy2004/archive/2009/07/05/285519.html#Feedback 2 http://www.aygfsteel.com/fhtdy2004/comments/commentRss/285519.html http://www.aygfsteel.com/fhtdy2004/services/trackbacks/285519.html 很显Ӟpthread中的条g变量与Java中的wait,notifycM
假设有共享的资源sum,与之相关联的mutex 是lock_s.假设每个U程对sum的操作很单的,与sum的状态无?比如只是sum++.那么只用mutex_?E序员只要确保每个线E操作前,取得lock,然后sum++,再unlock卛_.每个U程的代码将像这样add()
{
pthread_mutex_lock(lock_s);
sum++;
pthread_mutex_unlock(lock_s);
}
如果操作比较复杂,假设U程t0,t1,t2的操作是sum++,而线Et3则是在sum到达100的时?打印Z条信?q对sum清零.q种情况?如果只用mutex, 则t3需要一个@?每个循环里先取得lock_s,然后查sum的状?如果sum>=100,则打印ƈ清零,然后unlock.如果sum<100,则unlock,qsleep()本线E合适的一D|?
q个时?t0,t1,t2的代码不?t3的代码如?br />
print()
{
while (1)
{
pthread_mutex_lock(lock_s);
if(sum<100)
{
printf(“sum reach 100!”);
pthread_mutex_unlock(lock_s);
}
else
{
pthread_mutex_unlock(lock_s);
my_thread_sleep(100);
return OK;
}
}
}
q种办法有两个问?br />
1) sum在大多数情况下不会到?00,那么对t3的代码来?大多数情况下,走的是else分支,只是lock和unlock,然后sleep().q浪费了CPU处理旉.
2) Z节省CPU处理旉,t3会在探测到sum没到?00的时候sleep()一D|?q样却又带来另外一个问?亦即t3响应速度下降.可能在sum到达200的时?t3才会醒过?
3) q样,E序员在讄sleep()旉的时候陷入两隑֢?讄得太短了节省不了资源,太长了又降低响应速度.真是隑֊?
q个时?condition variable内裤外穿,从天而降,拯救了焦头烂额的?
你首先定义一个condition variable.
pthread_cond_t cond_sum_ready=PTHREAD_COND_INITIALIZER;
t0,t1,t2的代码只要后面加两行,像这?br />
add()
{
pthread_mutex_lock(lock_s);
sum++;
pthread_mutex_unlock(lock_s);
if(sum>=100)
pthread_cond_signal(&cond_sum_ready);
}
而t3的代码则?br />
print
{
pthread_mutex_lock(lock_s);
while(sum<100)
pthread_cond_wait(&cond_sum_ready, &lock_s);
printf(“sum is over 100!”);
sum=0;
pthread_mutex_unlock(lock_s);
return OK;
}
注意两点:
1) 在thread_cond_wait()之前,必须先lock相关联的mutex, 因ؓ假如目标条g未满?pthread_cond_wait()实际上会unlock该mutex, 然后block,在目标条件满_再重新lock该mutex, 然后q回.
2) Z么是while(sum<100),而不是if(sum<100) ?q是因ؓ在pthread_cond_signal()和pthread_cond_wait()q回之间,有时间差,假设在这个时间差?q有另外一个线Et4又把sum减少?00以下?那么t3在pthread_cond_wait()q回之后,昄应该再检查一遍sum的大?q就是用while的用?/p>
boost lib
http://www.stlchina.org/twiki/bin/view.pl/Main/BoostThread#safag7ZYn7rqw
文章出处QDIY部落(http://www.diybl.com/course/3_program/c++/cppxl/20090508/166837.html)
]]>POSIX thread (pthread) ?/title> http://www.aygfsteel.com/fhtdy2004/archive/2009/07/05/285518.htmlFrank_Fang Frank_Fang Sat, 04 Jul 2009 17:06:00 GMT http://www.aygfsteel.com/fhtdy2004/archive/2009/07/05/285518.html http://www.aygfsteel.com/fhtdy2004/comments/285518.html http://www.aygfsteel.com/fhtdy2004/archive/2009/07/05/285518.html#Feedback 0 http://www.aygfsteel.com/fhtdy2004/comments/commentRss/285518.html http://www.aygfsteel.com/fhtdy2004/services/trackbacks/285518.html ]]> POSIXU程和信号量结 http://www.aygfsteel.com/fhtdy2004/archive/2009/07/05/285517.htmlFrank_Fang Frank_Fang Sat, 04 Jul 2009 17:02:00 GMT http://www.aygfsteel.com/fhtdy2004/archive/2009/07/05/285517.html http://www.aygfsteel.com/fhtdy2004/comments/285517.html http://www.aygfsteel.com/fhtdy2004/archive/2009/07/05/285517.html#Feedback 0 http://www.aygfsteel.com/fhtdy2004/comments/commentRss/285517.html http://www.aygfsteel.com/fhtdy2004/services/trackbacks/285517.html 信号?/span>
基本操作
#include < semaphore.h >
int sem_init(sem_t * sem, int pshared, unsigned int value);
int sem_wait(sem_t * sem); /**/ /* P(sem), wait(sem) */
int sem_post(sem_t * sem); /**/ /* V(sem), signal(sem) */
int sem_getvalue(sem_t * sem, int * sval);
int sem_trywait(sem_t * sem);
int sem_destroy(sem_t * sem); /**/ /* undo sem_init() */
/**/ /* named semaphores - these are less useful here */
sem_t * sem_open( );
int sem_close(sem_t * sem);
int sem_unlink( const char * name);
互斥?/strong>
基本操作
#include < pthread.h >
int pthread_mutex_init(pthread_mutex_t * mutex, pthread_mutexattr_t * attr);
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int pthread_mutex_lock(pthread_mutex_t * mutex);
int pthread_mutex_unlock(pthread_mutex_t * mutex);
int pthread_mutex_trylock(pthread_mutex_t * mutex);
int pthread_mutex_destroy(pthread_mutex_t * mutex);
条g变量
一U信h?/p>
基本操作
#include < pthread.h >
int pthread_cond_init(pthread_cond_t * cond, pthread_condattr_t * attr);
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int pthread_cond_wait(pthread_cond_t * cond, pthread_mutex_t * mutex);
int pthread_cond_signal(pthread_cond_t * cond);
int pthread_cond_timedwait( );
int pthread_cond_broadcast(pthread_cond_t * cond);
int pthread_cond_destroy(pthread_cond_t * cond);
互斥量A保护条g变量B
// {待?/span>
pthread_mutex_lock( & A);
while ( ) { // 查条件是否满?/span>
pthread_cond_wait( & B, & A);
}
/**/ /* wait会隐式解锁A */
/**/ /* wait后A会被隐式锁住A */
pthread_mutex_unlock(& A);
// 通知?/span>
pthread_mutex_lock( & A);
pthread_cond_signal( & B);
pthread_mutex_unlock( & A);
]]>Linux下进E的各种状?/title> http://www.aygfsteel.com/fhtdy2004/archive/2009/07/05/285515.htmlFrank_Fang Frank_Fang Sat, 04 Jul 2009 16:21:00 GMT http://www.aygfsteel.com/fhtdy2004/archive/2009/07/05/285515.html http://www.aygfsteel.com/fhtdy2004/comments/285515.html http://www.aygfsteel.com/fhtdy2004/archive/2009/07/05/285515.html#Feedback 1 http://www.aygfsteel.com/fhtdy2004/comments/commentRss/285515.html http://www.aygfsteel.com/fhtdy2004/services/trackbacks/285515.html Linux下进E的各种状?br />
我的问题来了Q假如是一个进E用了udp的阻塞recvfrom()ҎQ在|络q接没有数据到达Ӟq程会在q个Ҏ上面dQ这个阻塞的意思是q程会进入等待队列,此时的进E处于下列的什么状态?Q然后cpuq而调度其他进E。。。还是cpu仍然l此q程分配旉片在它自q旉片上让其d在此Ҏ?q不是浪费cpu旉??
我是真的得好好看看操作系l的书了
D Uninterruptible sleep (usually IO)
不可中断的深度睡眠,一般由IO引vQ同步IO在做L写操作时Q此q程不能做其它事情,只能{待Q这时进E处于这U状态,如果E序采用异步IOQ这U状态应该就很少见到?br />
R Running or runnable (on run queue)
q程处于q行或就l状?br />
S Interruptible sleep (waiting for an event to complete)
可接收信L睡眠状态,sleep函数可演CU状?br />
T Stopped, either by a job control signal or because it is being traced.
被ctrl+z中断或被trace
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
q程已经完全LQ不可能看见q种状态的
Z Defunct ("zombie") process, terminated but not reaped by its parent.
q程已经l止Q但是其父进E没有来及处理它Q多q程写不好的话,q种状态是常见?br />
For BSD formats and when the stat keyword is used, additional characters may
be displayed:
< high-priority (not nice to other users)
N low-priority (nice to other users)
L has pages locked into memory (for real-time and custom IO)
s is a session leader
l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
+ is in the foreground process group
关于D和Z一D|的解释Q?br />
有一cd圑֍qq么Ҏ打扫Q那是我们常见的状态ؓ D (Uninterruptible sleep) Q以及状态ؓ Z (Zombie) 的垃圾进E。这些垃圾进E要么是求而不得,像怨妇一般等待资?D)Q要么是僵而不死,像冤一L待超?Z)Q它们在 CPU run_queue 里滞留不去,?Load Average 弄的老高老高Q没看过我前一blog的国际友以ؓq儿民怨沸腑֏Z什么大事呢。怎么办?开枪!kill -9Q看你们走是不走。但q两U垃圾进E偏偏是刀枪不入的Q不换哪种枪法都杀不掉它们。无奈,只好rebootQ像剿灭流感那样不分青U皂白地一律扑杀Q?br />
怨妇 DQ往往是由?I/O 资源得不到满I而引发等待,在内核源?fs/proc/array.c 里,其文字定义ؓ“ "D (disk sleep)", /* 2 */ ”Q由此可?D 原是Disk的打头字母)Q对应着 include/linux/sched.h 里的“ #define TASK_UNINTERRUPTIBLE 2 ”。D个例子,?NFS 服务端关闭之Ӟ若未事先 umount 相关目录Q在 NFS 客户端执?df ׃挂住整个d会话Q按 Ctrl+C 、Ctrl+Z 都无于事。断开q接再登录,执行 ps axf 则看到刚才的 df q程状态位已变成了 D Qkill -9 无法杀灭。正的处理方式Q是马上恢复 NFS 服务端,再度提供服务Q刚才挂L df q程发现了其苦苦{待的资源,便完成Q务,自动消亡。若 NFS 服务端无法恢复服务,?reboot 之前也应?/etc/mtab 里的相关 NFS mount 删除,以免 reboot q程例行调用 netfs stop 时再ơ发生等待资源,Dpȝ重启q程挂v?/p>
冤魂 Z 之所以杀不死Q是因ؓ它已l死了,否则怎么?ZombieQ僵)呢?冤魂不散Q自然是生前有结未解之故。在UNIX/Linux中,每个q程都有一个父q程Q进E号叫PIDQProcess IDQ,相应圎ͼ父进E号叫PPIDQParent PIDQ。当q程MӞ它会自动关闭已打开的文Ӟ舍弃已占用的内存、交换空间等{系l资源,然后向其父进E返回一个退出状态|报告死讯。如果程序有 bugQ就会在q最后一步出问题。儿子说我死了,老子却没听见Q没有及时收入D,儿子便成了僵。在UNIX/Linux中消灭僵的手段比较D忍Q执?ps axjf 扑և僵尸q程的父q程PPPIDQ第一列)Q先杀其父Q然后再pE天?initQ其PID?QPPID?Q来一h拄子僵,度亡魂Q往生极乐。注意,子进E变成僵只是碍D已Qƈ不碍事,如果僵尸的父q程当前有要务在w,则千万不可N然杀之?/p>
]]> waitpid http://www.aygfsteel.com/fhtdy2004/archive/2009/07/05/285514.htmlFrank_Fang Frank_Fang Sat, 04 Jul 2009 16:01:00 GMT http://www.aygfsteel.com/fhtdy2004/archive/2009/07/05/285514.html http://www.aygfsteel.com/fhtdy2004/comments/285514.html http://www.aygfsteel.com/fhtdy2004/archive/2009/07/05/285514.html#Feedback 0 http://www.aygfsteel.com/fhtdy2004/comments/commentRss/285514.html http://www.aygfsteel.com/fhtdy2004/services/trackbacks/285514.html
表头文g
#include<sys/types.h>
#include<sys/wait.h>
定义函数 pid_t waitpid(pid_t pid,int * status,int options);
函数说明
waitpid()会暂时停止目前进E的执行,直到有信h到或子进E?br />
l束。如果在调用 wait()时子q程已经l束,?wait()会立?br />
q回子进E结束状态倹{?子进E的l束状态g由参?status q回,
而子q程的进E识别码也会一赯回。如果不在意l束状态??br />
参数 status 可以设成 NULL。参?pid 为欲{待的子q程识别?
其他数值意义如?
pid<-1 {待q程l识别码?pid l对值的M子进E?br />
pid=-1 {待M子进E?相当?wait()?
pid=0 {待q程l识别码与目前进E相同的M子进E?
pid>0 {待M子进E识别码?pid 的子q程?br />
参数 option 可以?0 或下面的 OR l合:
WNOHANG 如果没有M已经l束的子q程则马上返? 不予以等待?br />
WUNTRACED 如果子进E进入暂停执行情况则马上q回,但结束状态不予以理会?br />
子进E的l束状态返回后存于 status,底下有几个宏可判别结束情?
WIFEXITED(status)如果子进E正常结束则为非 0 倹{?br />
WEXITSTATUS(status)取得子进E?exit()q回的结束代?一般会先用 WIFEXITED 来判断是否正常结束才能用此宏?br />
WIFSIGNALED(status)如果子进E是因ؓ信号而结束则此宏gؓ?br />
WTERMSIG(status) 取得子进E因信号而中止的信号代码,一般会先用 WIFSIGNALED 来判断后才用此宏?br />
WIFSTOPPED(status) 如果子进E处于暂停执行情况则此宏gؓ真。一般只有?WUNTRACED 时才会有此情c?br />
WSTOPSIG(status) 取得引发子进E暂停的信号代码,一般会先用 WIFSTOPPED 来判断后才用此宏?br />
如果执行成功则返回子q程识别?PID) ,如果有错误发生则q回
q回?1。失败原因存?errno 中?br />
/******
* waitpid.c - Simple wait usage
*********/
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
pid_t childpid;
int status;
childpid = fork();
if ( -1 == childpid )
{
perror( "fork()" );
exit( EXIT_FAILURE );
}
else if ( 0 == childpid )
{
puts( "In child process" );
sleep( 3 );//让子q程睡眠3U,看看父进E的行ؓ
printf("\tchild pid = %d\n", getpid());
printf("\tchild ppid = %d\n", getppid());
exit(EXIT_SUCCESS);
}
else
{
waitpid( childpid, &status, 0 );
puts( "in parent" );
printf( "\tparent pid = %d\n", getpid() );
printf( "\tparent ppid = %d\n", getppid() );
printf( "\tchild process exited with status %d \n", status );
}
exit(EXIT_SUCCESS);
}
[root@localhost src]# gcc waitpid.c
[root@localhost src]# ./a.out
In child process
child pid = 4469
child ppid = 4468
in parent
parent pid = 4468
parent ppid = 4379
child process exited with status 0
[root@localhost src]#
如果上?#8220;waitpid( childpid, &status, 0 );”行注释掉Q程序执行效果如下:
[root@localhost src]# ./a.out
In child process
in parent
parent pid = 4481
parent ppid = 4379
child process exited with status 1331234400
[root@localhost src]# child pid = 4482
child ppid = 1
子进E还没有退出,父进E已l退Z?
]]> Java中wait和notify与ACE中封装pthread条g变量来实C号量 http://www.aygfsteel.com/fhtdy2004/archive/2009/06/02/279553.htmlFrank_Fang Frank_Fang Tue, 02 Jun 2009 05:16:00 GMT http://www.aygfsteel.com/fhtdy2004/archive/2009/06/02/279553.html http://www.aygfsteel.com/fhtdy2004/comments/279553.html http://www.aygfsteel.com/fhtdy2004/archive/2009/06/02/279553.html#Feedback 0 http://www.aygfsteel.com/fhtdy2004/comments/commentRss/279553.html http://www.aygfsteel.com/fhtdy2004/services/trackbacks/279553.html Java中的wait和notify同步机制和pthread中的条g变量原理非常的类?br />
比如在实C号量Semaphore?br />
Java
ACE
]]>
վ֩ģ壺
¡ |
|
ͭ |
¸ |
|
ʲ |
̽ |
|
廪 |
|
|
|
Ϫ |
۰ |
|
|
|
|
|
ʳ |
Ȫ |
|
|
̨ʡ |
|
|
Դ |
ʤ |
|
|
|
|
տ |
ͩ |
ϴ |
ͨ |
|
ī |
կ |
Dz |
|