免费注册 查看新帖 |

Chinaunix

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

[C] fork出的子进程未被执行 [复制链接]

论坛徽章:
5
戌狗
日期:2014-06-09 10:29:10酉鸡
日期:2014-12-01 16:05:27处女座
日期:2015-01-07 18:35:262015亚冠之水原三星
日期:2015-06-03 09:26:222015亚冠之布里斯班狮吼
日期:2015-06-15 10:53:54
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-12-22 22:30 |只看该作者 |倒序浏览
之前发了一个关于popen后fgets阻塞的帖子
后来自己实现了popen函数,进一步定位阻塞的问题,但是目前没有思路,烦请高手指点!

伪代码如下:
  1. pid=fork()
  2. if(pid<0)
  3.     print error
  4. else if(pid == 0)
  5.     //child process
  6.     execl...
  7.     exit();
  8. else
  9.     //parent process
  10.     print pid
复制代码
在服务器上执行几次之后,发现child process 代码段没有被执行,即else if分支部分?
而parent process代码段中可以获取子进程的pid,即else分支有执行
提前谢过!

论坛徽章:
6
酉鸡
日期:2013-11-04 15:30:02巳蛇
日期:2014-01-23 10:36:23双鱼座
日期:2014-01-23 13:08:332015亚冠之鹿岛鹿角
日期:2015-09-03 14:36:002015亚冠之武里南联
日期:2015-09-18 10:48:1315-16赛季CBA联赛之山西
日期:2016-05-05 00:05:33
2 [报告]
发表于 2014-12-23 11:02 |只看该作者
exit();
这不是退出了么?

求职 : 机器学习
论坛徽章:
79
2015年亚洲杯纪念徽章
日期:2015-05-06 19:18:572015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之阿尔纳斯尔
日期:2015-09-07 09:30:232015亚冠之萨济拖拉机
日期:2015-10-21 08:26:3915-16赛季CBA联赛之浙江
日期:2015-12-30 09:59:1815-16赛季CBA联赛之浙江
日期:2016-01-10 12:35:21技术图书徽章
日期:2016-01-15 11:07:2015-16赛季CBA联赛之新疆
日期:2016-02-24 13:46:0215-16赛季CBA联赛之吉林
日期:2016-06-26 01:07:172015-2016NBA季后赛纪念章
日期:2016-06-28 17:44:45黑曼巴
日期:2016-06-28 17:44:4515-16赛季CBA联赛之浙江
日期:2017-07-18 13:41:54
3 [报告]
发表于 2014-12-23 12:01 |只看该作者
这个事执行完之后再进行退出的吧回复 2# Dannysd


   

论坛徽章:
5
戌狗
日期:2014-06-09 10:29:10酉鸡
日期:2014-12-01 16:05:27处女座
日期:2015-01-07 18:35:262015亚冠之水原三星
日期:2015-06-03 09:26:222015亚冠之布里斯班狮吼
日期:2015-06-15 10:53:54
4 [报告]
发表于 2014-12-23 12:31 |只看该作者
execl函数会将该进程替换

论坛徽章:
5
戌狗
日期:2014-06-09 10:29:10酉鸡
日期:2014-12-01 16:05:27处女座
日期:2015-01-07 18:35:262015亚冠之水原三星
日期:2015-06-03 09:26:222015亚冠之布里斯班狮吼
日期:2015-06-15 10:53:54
5 [报告]
发表于 2014-12-23 12:32 |只看该作者
我遇到的问题是,正常执行N次程序之后,会阻塞。现象是fork出的子进程分支没有走到,即execl没被执行,求解!

论坛徽章:
7
天秤座
日期:2014-08-07 13:56:30丑牛
日期:2014-08-27 20:34:21双鱼座
日期:2014-08-27 22:02:21天秤座
日期:2014-08-30 10:39:11双鱼座
日期:2014-09-21 20:07:532015年亚洲杯之日本
日期:2015-02-06 14:00:282015亚冠之大阪钢巴
日期:2015-11-02 14:50:19
6 [报告]
发表于 2014-12-23 14:10 |只看该作者
是不是父进程太早就退了,wait一下子进程试试?

论坛徽章:
0
7 [报告]
发表于 2014-12-23 14:30 |只看该作者
光从伪代码看不出任何问题,唯一就是子进程结束最好用_exit而不是exit。
父进程不需要wait,大不了子进程成zombie,但是还不至于不运行。

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
8 [报告]
发表于 2014-12-23 14:54 |只看该作者
把代码贴全看看

论坛徽章:
5
戌狗
日期:2014-06-09 10:29:10酉鸡
日期:2014-12-01 16:05:27处女座
日期:2015-01-07 18:35:262015亚冠之水原三星
日期:2015-06-03 09:26:222015亚冠之布里斯班狮吼
日期:2015-06-15 10:53:54
9 [报告]
发表于 2014-12-23 15:06 |只看该作者
本帖最后由 kaede_1 于 2014-12-23 15:06 编辑

首先,多谢各位回复。有个现象是会有很多次执行正常,应该可以说自己实现的popen在功能上应该是可行的。就是不知道为什么N次之后fork的子进程未执行??

代码如下:
  1. FILE * xs_popen(const char *cmdstring, const char *type)
  2. {
  3.     int     i;
  4.     int     pfd[2];
  5.     pid_t   pid;
  6.     FILE    *fp;

  7.     /* only allow "r" or "w" */
  8.     if ((type[0] != 'r' && type[0] != 'w') || type[1] != 0) {
  9.         errno = EINVAL;     /* required by POSIX */
  10.         return(NULL);
  11.     }

  12.     if (childpid == NULL) {     /* first time through */
  13.         /* allocate zeroed out array for child pids */
  14.         maxfd = 1024;
  15.         if ((childpid = calloc(maxfd, sizeof(pid_t))) == NULL)
  16.         {
  17.             return(NULL);
  18.         }
  19.     }

  20.     if (pipe(pfd) < 0)
  21.     {
  22.         return(NULL);   /* errno set by pipe() */
  23.     }

  24.     if ((pid = fork()) < 0) {
  25.         return(NULL);   /* errno set by fork() */
  26.     } else if (pid == 0) {                           /* child */
  27.         if (*type == 'r') {
  28.             close(pfd[0]);
  29.             if (pfd[1] != STDOUT_FILENO) {
  30.                 dup2(pfd[1], STDOUT_FILENO);
  31.                 close(pfd[1]);
  32.             }
  33.         } else {
  34.             close(pfd[1]);
  35.             if (pfd[0] != STDIN_FILENO) {
  36.                 dup2(pfd[0], STDIN_FILENO);
  37.                 close(pfd[0]);
  38.             }
  39.         }
  40.         /* close all descriptors in childpid[] */
  41.         for (i = 0; i < maxfd; i++)
  42.             if (childpid[i] > 0)
  43.                 close(i);
  44.         execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);
  45.         _exit(127);
  46.     }

  47.     /* parent continues... */
  48.     if (*type == 'r') {
  49.         close(pfd[1]);
  50.         if ((fp = fdopen(pfd[0], type)) == NULL)
  51.             return(NULL);
  52.     } else {
  53.         close(pfd[0]);
  54.         if ((fp = fdopen(pfd[1], type)) == NULL)
  55.             return(NULL);
  56.     }

  57.     childpid[fileno(fp)] = pid; /* remember child pid for this fd */
  58.     return(fp);
  59. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP