- 论坛徽章:
- 0
|
在编程中遇到的一个可笑的问题,虽然解决,但是根本不知为什么能够解决,两种代码在功能上是完全\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------------------------------------------------------------------------------------ |
|