当前位置: 技术问答>linux和unix
c在linux下编程fork()遇到问题了。
来源: 互联网 发布时间:2015-07-18
本文导语: 我写了程序,fork()后,加了个printf(),然后再往后,调用getenv时候弄错了东西。 开始运行怎么反应都没有,这个printf()就是打不出来而且是放在后面的都printf()都打不出来。。但是在fork()前加printf()就可以打出来。 ...
我写了程序,fork()后,加了个printf(),然后再往后,调用getenv时候弄错了东西。
开始运行怎么反应都没有,这个printf()就是打不出来而且是放在后面的都printf()都打不出来。。但是在fork()前加printf()就可以打出来。
后来把后面getenv错误改掉了。。就可以打出来了。这是为什么啊,大概程序是这样的
printf("1:");
if ((childpid=fork())0)
{
printf("2:");
close(newsockfd);
return(childpid);
}
close(sockfd);
sockfd=newsockfd;
........省
getenv("SCIENCE");
我开始弄错的是SCIENCE,拼写错了。
总的来说就是开始后面错,能打出“1”不能打出“2”,后来改了错,都能打了。。
为什么啊?请指教啊~
开始运行怎么反应都没有,这个printf()就是打不出来而且是放在后面的都printf()都打不出来。。但是在fork()前加printf()就可以打出来。
后来把后面getenv错误改掉了。。就可以打出来了。这是为什么啊,大概程序是这样的
printf("1:");
if ((childpid=fork())0)
{
printf("2:");
close(newsockfd);
return(childpid);
}
close(sockfd);
sockfd=newsockfd;
........省
getenv("SCIENCE");
我开始弄错的是SCIENCE,拼写错了。
总的来说就是开始后面错,能打出“1”不能打出“2”,后来改了错,都能打了。。
为什么啊?请指教啊~
|
我觉得应该是这样的:
按照程序的现象,fork()进程后,操作系统可能是先让子进程运行,也就是先执行getenv(),但是因为并不存在这个环境变量,所以,子进程就阻塞了。所以父进程就没有机会运行了。当你修改后,子进程可以顺利的得到相应的环境变量并退出,然后父进程运行,“2”就可以打印出来了。
仅供参考!
按照程序的现象,fork()进程后,操作系统可能是先让子进程运行,也就是先执行getenv(),但是因为并不存在这个环境变量,所以,子进程就阻塞了。所以父进程就没有机会运行了。当你修改后,子进程可以顺利的得到相应的环境变量并退出,然后父进程运行,“2”就可以打印出来了。
仅供参考!
|
这里有两方面的因素,一是printf()是line buffer的,也就是碰到换行时才将当前缓冲输出;另一个是进程之间运行问题。
从你的程序看,两个print()都没有换行符,所以是打印在同一行而且要等到程序结束时才输出。如果程序正常结束,它当然应该输出1:2:。
在你的子进程中,当你的getenv()中参数拼写错误时,它(getenv())返回NULL,如果你没有用到此指针,程序会继续执行到正常结束。如果你dereference了它,程序会core dump。此时,父进程会收到SIGCHLD信号。父进程的行为就会受到这个信号的影响,如果它的SIGCHLD handler是结束程序,那么父进程就此结束。
一般书上说fork()以后是父进程还是子进程先运行是不定的,但是绝大多数UNIX都是子进程先运行。你知道为什么吗?
试试在有错误拼写的getenv()前sleep()一下,看结果又有什么不同。
你只给出程序的概貌,所以很难具体告诉你为什么。
从你的程序看,两个print()都没有换行符,所以是打印在同一行而且要等到程序结束时才输出。如果程序正常结束,它当然应该输出1:2:。
在你的子进程中,当你的getenv()中参数拼写错误时,它(getenv())返回NULL,如果你没有用到此指针,程序会继续执行到正常结束。如果你dereference了它,程序会core dump。此时,父进程会收到SIGCHLD信号。父进程的行为就会受到这个信号的影响,如果它的SIGCHLD handler是结束程序,那么父进程就此结束。
一般书上说fork()以后是父进程还是子进程先运行是不定的,但是绝大多数UNIX都是子进程先运行。你知道为什么吗?
试试在有错误拼写的getenv()前sleep()一下,看结果又有什么不同。
你只给出程序的概貌,所以很难具体告诉你为什么。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。