免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5314 | 回复: 5
打印 上一主题 下一主题

[C] 请问创建进程fork用法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-27 11:18 |只看该作者 |倒序浏览
小弟最近在学LINUX C编程, 现在看到创建进程这一块,有些地方不太明白,望各位朋友和前辈们指点一下!

下面是在一个教程上看到的讲解例子,讲得很明白, 只是我有点不太理解fork的用法.

     #include <sys/types.h>
     #include <unistd.h>

     pid_t fork(void);
     pid_t pid;

     switch (pid = fork())
     {
     case -1:
         /* 这里pid为-1,fork函数失败 */
         /* 一些可能的原因是 */
         /* 进程数或虚拟内存用尽 */
         perror("The fork failed!");
         break;

     case 0:
         /* pid为0,子进程 */
         /* 这里,我们是孩子,要做什么? */
         /* ... */
         /* 但是做完后, 我们需要做类似下面: */
         _exit(0);

     default:
         /* pid大于0,为父进程得到的子进程号 */
         printf("Child's pid is %d\n",pid);
     }

fork()函数创建完子进程后,我怎么控制子进程? 在case 0里做吗?  我运行了上面的程序,没得到过0的时候.  如果0和大于0的数都代表子进程,那又为什么将它们区别开呢?     也许我是陷入一个死角了,这个问题对于大家来说根本不能算个问题,那就请各位把我从角落里拉出来吧,谢谢了!

论坛徽章:
1
巨蟹座
日期:2013-12-30 17:06:34
2 [报告]
发表于 2009-03-27 11:33 |只看该作者
fork 会产生2个返回值。
1)0 in child.
2)process id of child in parent 。
出错的话 返回-1.

int func1()
{
       pid_t pid;
       if( (pid=fork()) <0)
           printf("fork error\n" );
       if( pid==0)
       {
               /* do somthing in child */
               _exit(0);  /* 注意 _exit 和 exit 的区别 */
        }else
       {
                /* do somthing in parent */
                exit (0);
        }
}

同时还要处理.rare condition.(竟争状态?翻的不好,见谅。),
在 child 或 parent 中 加入sleep(int).让 parent 或 child 先运行。

[ 本帖最后由 Darleter 于 2009-3-27 11:37 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-03-27 11:44 |只看该作者
感谢 Darleter  的回复!  我想你已经讲得很好了, 可是有一点我还是不明白,  好像只能在父进程和子进程之间执行一个, 不能既让子进程做些事,又让父进程做些事吗?   我不知道fork()究竟做了什么,还有对当前程序的影响..    有点乱,糊涂了.....

论坛徽章:
1
巨蟹座
日期:2013-12-30 17:06:34
4 [报告]
发表于 2009-03-27 11:51 |只看该作者
原帖由 xht314 于 2009-3-27 11:44 发表
感谢 Darleter  的回复!  我想你已经讲得很好了, 可是有一点我还是不明白,  好像只能在父进程和子进程之间执行一个, 不能既让子进程做些事,又让父进程做些事吗?   我不知道fork()究竟做了什么,还有对当前程序的 ...


在 freebsd 条件下,一旦fork之后,不考虑 cpu的 队列问题。表象上是parent和child同时运行的。所以才会产生 rare conditon.
至于用来干什么,举个例子。
你用父进程监听,而子进程负责处理事件,一旦事件处理完成,退出。
至于fork究竟做了什么,简单来说,复制了整个父进程。

论坛徽章:
0
5 [报告]
发表于 2009-03-27 11:55 |只看该作者

回复 #3 xht314 的帖子

其实在
if( pid==0)
       {
               /* do somthing in child */
               _exit(0);  /* 注意 _exit 和 exit 的区别 */
        }else
       {
                /* do somthing in parent */
                exit (0);
        }
是由两个进程一起在执行的。就是说在父进程和子进程中一起执行这段代码,但是由于父进程和子进程获取的pid的值是不一样的所以父子两个执行的逻辑就不一样了。也不知道说清楚没有。

论坛徽章:
0
6 [报告]
发表于 2009-03-27 12:42 |只看该作者
啊!!!!! 终于让我恍然大惚了, 非常感谢Darleter 和singerinsky的指点.

我最开始的程序是:
     #include <sys/types.h>
     #include <unistd.h>

     pid_t fork(void);
     pid_t pid;

     switch (pid = fork())
     {
     case -1:

         perror("The fork failed!";
         break;

     case 0:
         printf("I'm a child!";
         _exit(0);

     default:
         printf("Child's pid is %d\n",pid);
     }

编辑后运行发现只打印了default里面的.  经过两位的讲解之后我才明白,原因是因为我执行的是父进程,所以子进程的打印不会在终端中打印出来,  而后我又在case 0: 块中加了 system("touch /home/tom/abc.txt";   再次编译执行,发现abc.txt文件被创建了,看来在调用fork()的那一刻,程序被复制了一份作为子进程了,是吧?   不知道我理解的对不对??
还有一个问题,我觉得我说"复制可能不对" 如果switch块后面还有 语句的话,难道父子进程都会执行吗?  还是说只是相当于把 case 0块里的代码复制作为子进程呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP