星期四, 8月 12, 2004

uClinux Function - vfork

fork和vfork都是產生child process的function call,
fork後好像會先執行child process,再執行parent process。

在uClinux裡,fork不行用,要用vfork,但是vfork和fork不一樣,

vfork的child和parent使用相同的memory space,所以child process不可以直接結束。
要用exit()或是呼叫exec??( )執行其他外部程式來結束自己。

如果不用exit而結束, 會有"Illegal instruction"或是'SIGSEGV"的error message。

另一點
vfork不能像fork一樣,
以下面的fork一個child process作daemon的code來看
int main(int argc, char *argv[])

{
char c;
int _argc = 0;
char *_argv[3];
pid_t pid;

if ((pid = fork()) <>把fork改為vfork後雖然parent有作exit(),但是因為和vfork的parent,child使用相同的
memory space,所以直到child也exit()或exec??()前,parent都無法結束。
所以以vfork來作上面的例子

int execed = 0;


int main(int argc, char *argv[])
{
char c;
int _argc = 0;
char *_argv[3];
pid_t pid;

while ((c=getopt(argc, argv, "D")) > 0) {
switch(c) {
case 'D':
execed = 1;
break;
default:
fprintf(stderr, "You probably don't want to pass "
"options to this\n");
exit(1);
}
}

if (!execed) {
if ((pid = vfork()) <>

沒有留言:

張貼留言