搜索
bottom↓
回复: 2

请教:嵌入式linux执行system函数程序崩溃

[复制链接]

出0入0汤圆

发表于 2011-6-10 09:52:05 | 显示全部楼层 |阅读模式
最近遇到个比较奇怪的问题,函数中执行system系统函数时程序就崩溃掉了。


但是,我单独写个测试函数,执行system函数没有问题,怀疑是不是交叉编译链接环境有影响?



有经验的大侠看过来!

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2011-6-16 22:41:43 | 显示全部楼层
还未解决,抽

出0入0汤圆

 楼主| 发表于 2011-6-27 09:13:26 | 显示全部楼层
问题解决了,在网上找到的如下:


原因好像是因为SIGCHLD的默认动作好像不是IGNORE。我写了个测试代码(在最后,a.c)。
gcc a.c
执行a.out DFL正常,执行a.out IGN就会返回-1,错误码解释为“No child processes”。
分别执行 strace -o DFL.log a.out DFL 和 strace -o IGN.log a.out IGN
比较两个文件,
前者为 rt_sigaction(SIGCHLD, {SIG_DFL}, {SIG_DFL}, 8) = 0
后者为 rt_sigaction(SIGCHLD, {SIG_IGN}, {SIG_DFL}, 8) = 0
这似乎是唯一区别。似乎能解释返回-1的原因。
但记得SIGCHLD的默认动作好像就是忽略。
并且,看不懂问题代码的那段。
rt_sigaction(SIGINT, {SIG_IGN}, {0xd92508, ~[ILL ABRT BUS FPE KILL SEGV STOP XCPU XFSZ SYS RTMIN RT_1], SA_RESTART|SA_SIGINFO}, 8) = 0
rt_sigaction(SIGQUIT, {SIG_IGN}, {SIG_IGN}, 8) = 0


/* ************************************************ */
/*                                          test code a.c                                    */
/* ************************************************ */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>

int main(int argc, char * argv[])
{
        static struct sigaction act;
        static struct sigaction old_act;
        char command[60];
        int ret = -1;
        int i = 0;
        
        sigemptyset(&act.sa_mask);
        sigaddset(&act.sa_mask, SIGCHLD);
        act.sa_flags = SA_RESTART;
        
        if (argc == 2)
        {
                if (!memcmp(argv[1], "IGN", 3))
                {
                        act.sa_handler = SIG_IGN;
                }
                else if (!memcmp(argv[1], "DFL", 3))
                {
                        act.sa_handler = SIG_DFL;
                }
                else
                {
                        printf("useage: %s IGN  DFL \n", argv[0]);
                        return -1;
                }
        }
        else
        {
                printf("useage: %s IGN | DFL \n", argv[0]);
                return -1;
        }
        
        if (sigaction(SIGCHLD, &act, &old_act) == -1)
        {
                perror("sigaction");
                return -1;
        }
        
        ret = sigismember(&act.sa_mask, SIGCHLD);
        printf("ret = %d\n",ret);
        memset(command, 0x00, sizeof(command));
        strcpy(command, "ls -al");
        ret = system(command);
        printf("ret = %d\n",ret);
        if (ret)
        {
                perror("system");
                return -1;
        }
        return 0;
}
/* ************************************************ */
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 16:44

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表