免费注册 查看新帖 |

Chinaunix

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

[Linux] fork、execl创建多进程,出现僵死进程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-15 10:12 |只看该作者 |倒序浏览
本帖最后由 yff1030 于 2012-08-16 07:50 编辑

该程序想要实现把指定目录下的.wav文件转换为mp3文件,而且利用多进程实现。所以,每个进程处理固定数量(由SINGLENUM指定,在本例用为10个)的源音频文件。部分代码如下:
[code]

int searchdir( char *path )
{
        unsigned int count=0;                                                                       
        char txtname[128];                                                                       
        DIR *dp ;
        struct dirent *dirp ;                                                 
       
                                                                                                                //打开指定目录
        if( (dp = opendir( path )) == NULL )
        {
             perror("opendir");
        }
        if((fp= fopen("01.txt","w+")) == NULL)                                //创建第一个可读写的文件
        {
                perror("fopen");
                exit(EXIT_FAILURE);
        }
                                                                                                                //开始遍历目录
        while( ( dirp = readdir( dp ) ) != NULL)
        {
                                                                                                                //跳过'.'和'..'两个目录
                if(strcmp(dirp->d_name,".")==0  || strcmp(dirp->d_name,"..")==0)
                        continue;

                int size = strlen(dirp->d_name);

                                                                                                                //如果是.wav文件,长度至少是5
                if(size<5)       
                        continue;

                                                                                                                //只存取.wav扩展名的文件名
                if(strcmp( ( dirp->d_name + (size - 4) ) , ".wav") != 0)
                    continue;       

                /*把文件名d_name 每SINGLENUM个写入一个文件,
                **用一个变量count记录遍历到的文件的数量,
                **每SINGLENUM个打开一个新文件
                */       
               
                if( (++count) > SINGLENUM )                                               
                {
                        fclose(fp);
                        times++;
                        sprintf(txtname , "%02d.txt", times);                                                                                                       
                          if( ( fp = fopen(txtname,"w+") ) == NULL )
                        {
                                perror("fopen");
                                exit(EXIT_FAILURE);
                        }
                       
                        count=1;
                }
                fputs(path,fp);                                                                        //向新建的txt文本里写入.wav文件的绝对路径
                fputs(dirp->d_name,fp);
                fputs(" ",fp);                                                                        // 在一个filename结束之后,写入空格,方便脚本读取,进程转换操作

        }                                                                                                                //关闭目录
                closedir(dp);
                return 0;
       
       
}






1}UZV9[1(AU~8U2))8[%%{8.jpg (12.53 KB, 下载次数: 63)

1}UZV9[1(AU~8U2))8[%%{8.jpg

论坛徽章:
0
2 [报告]
发表于 2012-08-15 10:13 |只看该作者
本帖最后由 yff1030 于 2012-08-15 10:31 编辑

大家帮我分析一下

论坛徽章:
0
3 [报告]
发表于 2012-08-15 10:31 |只看该作者
这个问题值得研究下。。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2012-08-15 11:39 |只看该作者
[ 本帖最后由 MMMIX 于 2012-08-15 11:40 编辑 ]

[quote][size=2][color=#000]yff1030 发表于 2012-08-15 10:12[/color] [url=forum.php?mod=redirect&goto=findpost&pid=22244759&ptid=3765157][img]static/image/common/back.gif[/img][/url][/size]
                else if(child==0)                                                                //子进程执行
                {
//                        pid=getpid();                                                        //这里的不会执行,why?
//                        printf("in the child process pid = %d", pid);                        
                        if( execl("./batchconvert", "./batchconvert ",txtname, (char *)0 ) == -1 )
[/quote]
execl 前面那两行肯定是执行了的,只不过还没有输出程序的映像就被替换了。试试在 printf 后面加上 fflush(NULL); 试试。

[quote]     
                else                                                                                        //父进程运行
                {        
                        pid=child;                                                                //保存子进程的进程号
                        printf(" the child process pid = %d\n", pid);
                }   
        }
        for(i=0;i<num;i++)
        {
                if(waitpid(pid,NULL,0)!=pid)
                        perror("waitpid");
                                
        }[/quote]
pid=child; 这行应该是 pid[i] = child; waitpid 中使用的 pid 类似。

论坛徽章:
0
5 [报告]
发表于 2012-08-15 12:15 |只看该作者
回复 4# MMMIX
恩,那个pid的那个地方是我刚才弄错了。
已经改正了。
可是问题是一样的。

   

论坛徽章:
0
6 [报告]
发表于 2012-08-15 12:16 |只看该作者
本帖最后由 yff1030 于 2012-08-15 16:06 编辑

重新编辑了一下

论坛徽章:
0
7 [报告]
发表于 2012-08-15 13:42 |只看该作者
看了下,感觉没问题~~

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
8 [报告]
发表于 2012-08-15 13:48 |只看该作者
回复 5# yff1030


    什么问题?

BTW,你的代码并不完整,其他部分,包括那个脚本都没有提供,你让别人怎么诊断?

论坛徽章:
0
9 [报告]
发表于 2012-08-15 16:06 |只看该作者
回复 8# MMMIX
已经按照您的指示重新编辑了帖子!


   

论坛徽章:
0
10 [报告]
发表于 2012-08-15 16:09 |只看该作者
其中遍历目录的那个子函数应该没问题因为对应的txt文件中可以写入类似/usr/audio/a.wav
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP