免费注册 查看新帖 |

Chinaunix

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

求教:在使用fork()和execl()时遇到的问题...... [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-05-30 21:54 |只看该作者 |倒序浏览
在编程中遇到的一个可笑的问题,虽然解决,但是根本不知为什么能够解决,两种代码在功能上是完全\r\n\r\n等效的,且全部符合语法规范,但是前者的错误及其荒谬,而后者却可以很好的执行,真是怪事!!!!!!\r\n\r\n求高手关于问题的答案,谁可以解释这种现象?\r\n\r\n系统:solaris linux(问题是一样的)\r\n工具:gcc\r\n\r\n-------------------------一个模拟system()的函数版本1-----------------------------------\r\n\r\n#include\"sysError.h\"\r\n\r\n#include<stdlib.h>;\r\n#include<stdio.h>;\r\n#include<errno.h>;\r\n#include<signal.h>;\r\n\r\nint debug;\r\nextern int errno;\r\n\r\nint systemexec(const char* cmdstring){\r\n        \r\n        pid_t pid;\r\n        int status;\r\n        struct sigaction ignore,saveintr,savequit;\r\n        sigset_t childmask,savemask;\r\n        \r\n        if(cmdstring ==NULL)\r\n                err_sys(\"fork error\";\r\n        \r\n        ignore.sa_handler=SIG_IGN;\r\n        sigemptyset(&ignore.sa_mask);\r\n        ignore.sa_flags =0;\r\n        \r\n        if(sigaction(SIGINT,&ignore, &saveintr)<0)\r\n                return -1;\r\n        if(sigaction(SIGQUIT,&ignore,&savequit)<0)\r\n                return -1;\r\n        \r\n        sigemptyset(&childmask);\r\n        sigaddset(&childmask,SIGCHLD);\r\n        \r\n        if(sigprocmask(SIG_BLOCK,&childmask,&savemask)<0)\r\n                return -1;\r\n        \r\n        if(pid=fork()<0)//使用if else语句,出错!!!!!!!改用switch则可以正常的运行\r\n                err_sys(\"fork error\";\r\n        \r\n        else if(pid == 0){\r\n                                \r\n                sigaction(SIGINT,&saveintr,NULL);\r\n                sigaction(SIGQUIT,&savequit,NULL);\r\n                \r\n                sigprocmask(SIG_SETMASK,&savemask,NULL);\r\n                \r\n                system(\"/bin/sh -c date\";\r\n                //_exit(127);\r\n                                        \r\n        }\r\n        else{\r\n                while(waitpid(pid,&status,0)<0)\r\n                        if(errno=EINTR){\r\n                                status=-1;\r\n                                break;\r\n                        }\r\n                \r\n        }\r\n        \r\n\r\n        if(sigaction(SIGINT,&saveintr,NULL)<0)\r\n                return (-1);\r\n        if(sigaction(SIGQUIT,&savequit,NULL)<0)\r\n                return (-1);\r\n        if(sigprocmask(SIG_SETMASK,&savemask,NULL)<0)\r\n                return (-1);\r\n        return (status);\r\n        \r\n}\r\n\r\nint main(){\r\n        \r\n        printf(\"the system was called now\\n\";\r\n        if ((debug=systemexec(\"date\")<0)\r\n                printf(\"the system call error is %d\\n\",debug);\r\n        \r\n        printf(\"\\n\";\r\n}\r\n----------------------------------------------------------------------------------------\r\n\r\n运行的结果:\r\n\r\n\r\n五月  4日  2 00:27:04 CST 2005\r\nthe system call error is -1073746636\r\n\r\n-bash-2.05b$ 五月  4日  2 00:27:04 CST 2005\r\nthe system call error is -1073746636\r\n\r\n1:子进程运行了两次,且execl函数不能返回;\r\n2调试时出现SIG_TARP硬件中断信号,试过多种处理方法,比如阻塞,忽略都不能奏效)        \r\n\r\n-----------------------------修改后的代码--------------------------------------------\r\n#include \"sysError.h\"\r\n\r\n#include<errno.h>;\r\n#include<stdlib.h>;\r\n#include<stdio.h>;\r\n\r\n#include<signal.h>;\r\n#include<unistd.h>;\r\n#include<sys/wait.h>;\r\n#include<sys/types.h>;\r\n\r\n\r\nint debug;\r\nint systemexec(const char* cmdstring){\r\n        \r\n        pid_t pid;\r\n        int status;\r\n\r\n        char* cmd=cmdstring;\r\n        struct sigaction ignore,saveintr,savequit;\r\n        \r\n        sigset_t childmask,savemask;\r\n        \r\n        if(cmdstring ==NULL)\r\n                err_sys(\"the command paramter error\";\r\n        \r\n        ignore.sa_handler=SIG_IGN;\r\n        sigemptyset(&ignore.sa_mask);\r\n        ignore.sa_flags=0;\r\n        \r\n        if(sigaction(SIGINT,&ignore,&saveintr)<0)\r\n                return -1;\r\n        if(sigaction(SIGQUIT,&ignore,&savequit)<0)\r\n                return -1;\r\n        \r\n        sigemptyset(&childmask);\r\n        sigaddset(&childmask,SIGCHLD);\r\n        \r\n        if(sigprocmask(SIG_BLOCK,&childmask,&savemask)<0)\r\n                return -1;\r\n        \r\n        switch(pid=fork()){//使用switch语句,运行结果正常...\r\n        case -1:\r\n                \r\n                status=-1;\r\n                printf(\"the fork operation error\";\r\n                break;\r\n        \r\n        case 0:\r\n                \r\n                sigaction(SIGINT,&saveintr,NULL);\r\n                sigaction(SIGQUIT,&savequit,NULL);\r\n                \r\n                sigprocmask(SIG_SETMASK,&savemask,NULL);\r\n                \r\n                execl(\"/bin/sh\",\"sh\",\"-c\" ,cmd ,(char*)0);\r\n                _exit(127);\r\n                \r\n        default:\r\n                \r\n                while(waitpid(pid,&status,0)<0)\r\n                        if(errno=EINTR){\r\n                                status=-1;\r\n                                break;\r\n                        }\r\n\r\n\r\n                if(sigaction(SIGINT,&saveintr,NULL)<0)\r\n                        return (-1);\r\n                if(sigaction(SIGQUIT,&savequit,NULL)<0)\r\n                        return (-1);\r\n                if(sigprocmask(SIG_SETMASK,&savemask,NULL)<0)\r\n                        return (-1);\r\n                        \r\n        }\r\n                return (status);\r\n\r\n}\r\n        \r\nint main(){\r\n        \r\n        if ((debug=systemexec(\"date\")<0)\r\n                printf(\"the system call error is %d\\n\",debug);\r\n        \r\n        printf(\"\\n\";\r\n}\r\n------------------------------------------------------------------------------------\r\n运行结果:\r\n\r\n五月  4日 2 00:34:12 CST 2005\r\n\r\n运行正常,测试正常:\r\n\r\n\r\n------------------------------------------------------------------------------------
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP