当前位置: 技术问答>linux和unix
多进程的问题,分随便你要,顶者有分啊
来源: 互联网 发布时间:2015-08-29
本文导语: 今天不知道是天气不好还是俺精神憔悴了。。。 原来很正常的程序段换个地方后搁浅了。 郁闷中。。。 A.程序段附后。此程序段没执行一次MySystem(...)后整个程序就会减少一个进程(超不超时都是一样)。...
今天不知道是天气不好还是俺精神憔悴了。。。
原来很正常的程序段换个地方后搁浅了。
郁闷中。。。
A.程序段附后。此程序段没执行一次MySystem(...)后整个程序就会减少一个进程(超不超时都是一样)。如果我没有把(1)部 分加入,最后将只剩下主进程。就是挂了。加上(1)部分当然命运不会好多少。。。
B.这段程序(主要指MySystem部分)在原来的POSIX子线程中反而工作得很正常,只是GTK的GUI界面给挂了。不过在那只是测试,没管那么多。
奇怪的是在A中居然从(2)执行完又回到(3),而在 B 中则不会发生这样的事。
哎。。。该正常的地方不正常,不该正常的地方反而正常了,死不瞑目啊.
拿位兄弟指点一下,不胜感激。
分可随便要,可另给开帖.
//--------------------- main.c ----------------
主进程
...
signal(SIGCHLD, SIG_IGN);
if(!fork())
{
if(!fork())
{
FtpProcess(0);
exit(1);
}
else
{
while(1) //(1)
{
wait(NULL);
FtpProcess(0); //(1)
}
}
}
........
//----------------------------------------------
//------------ FtpProcess(...) ---------------
void FtpProcess(int nID)
{
...
for( ; ; )
{
...
MySystem(COMMOND);
...
}
...
}
//--------------------------------------------
//---------------other define .c----------------
pid_t pid;
void alarm_fuc( int signo)
{
kill(pid,SIGKILL); //与kill无关
kill(pid+1,SIGKILL);
// alarm(0);
exit(1); // (2)
}
int MySystem(char *strCmd)
{
if(fork()==0)
{
pid=fork();
switch(pid)
{
case 0:
execl("/bin/sh","sh","-c",strCmd,NULL);
return -1;
case -1:
return -1;
default:
signal(SIGALRM, alarm_fuc);
sleep(1);
alarm(10);
wait(NULL);
alarm(0); //(3)
exit(0);
}
}
else
wait(NULL);
}
//---------------------------------------------
原来很正常的程序段换个地方后搁浅了。
郁闷中。。。
A.程序段附后。此程序段没执行一次MySystem(...)后整个程序就会减少一个进程(超不超时都是一样)。如果我没有把(1)部 分加入,最后将只剩下主进程。就是挂了。加上(1)部分当然命运不会好多少。。。
B.这段程序(主要指MySystem部分)在原来的POSIX子线程中反而工作得很正常,只是GTK的GUI界面给挂了。不过在那只是测试,没管那么多。
奇怪的是在A中居然从(2)执行完又回到(3),而在 B 中则不会发生这样的事。
哎。。。该正常的地方不正常,不该正常的地方反而正常了,死不瞑目啊.
拿位兄弟指点一下,不胜感激。
分可随便要,可另给开帖.
//--------------------- main.c ----------------
主进程
...
signal(SIGCHLD, SIG_IGN);
if(!fork())
{
if(!fork())
{
FtpProcess(0);
exit(1);
}
else
{
while(1) //(1)
{
wait(NULL);
FtpProcess(0); //(1)
}
}
}
........
//----------------------------------------------
//------------ FtpProcess(...) ---------------
void FtpProcess(int nID)
{
...
for( ; ; )
{
...
MySystem(COMMOND);
...
}
...
}
//--------------------------------------------
//---------------other define .c----------------
pid_t pid;
void alarm_fuc( int signo)
{
kill(pid,SIGKILL); //与kill无关
kill(pid+1,SIGKILL);
// alarm(0);
exit(1); // (2)
}
int MySystem(char *strCmd)
{
if(fork()==0)
{
pid=fork();
switch(pid)
{
case 0:
execl("/bin/sh","sh","-c",strCmd,NULL);
return -1;
case -1:
return -1;
default:
signal(SIGALRM, alarm_fuc);
sleep(1);
alarm(10);
wait(NULL);
alarm(0); //(3)
exit(0);
}
}
else
wait(NULL);
}
//---------------------------------------------
|
你的程序是不是有问题,居然调用了4次fork,你疯了吗?
另外,执行完2后执行3也狠正常啊,在设置alarm(10);后,阻塞于wait(NULL);调用,10秒钟后程序收到SIGALRM信号,执行alarm_fuc,执行完后在刚才程序执行的地方继续执行,由于程序收到信号,wait调用被中断,将执行alarm(0)。你的这种用法狠正常啊。
另外,执行完2后执行3也狠正常啊,在设置alarm(10);后,阻塞于wait(NULL);调用,10秒钟后程序收到SIGALRM信号,执行alarm_fuc,执行完后在刚才程序执行的地方继续执行,由于程序收到信号,wait调用被中断,将执行alarm(0)。你的这种用法狠正常啊。