问system返回值

jackxiang 2008-4-3 19:00 | |
#include <stdio.h>;
#include <stdlib.h>;
#include <sys/wait.h>;
#include <sys/types.h>;

int main()
{
        
        pid_t status ;
        
        errno = 0 ;
        status = system("cp hello.c hello.c.bak") ;
                
        if (status == -1)
                printf("system error!") ;
        
        if (WIFEXITED(status)){
                printf("cp exit normal![%d]\n", errno) ;
                printf("exit staus = [%X]\n", WEXITSTATUS(status)) ;
        }else
                printf("cp exit illegal![%d]\n", errno) ;
}

[/code]

测试了一把.结果如下
如果hello.c存在,cp也成功将hello.c拷贝到了hello.c.bak则打印
cp exit normal![0]
exit status = [0]
如果hello.c不存在,则打印
cp exit normal![0]
exit status = [1]

我的问题是.
1.在何种情况下会打印cp exit illegal!
2.如果是exit normal,那么exit status的值是否和system调用执行的进程紧密相关(如本例中的cp)
3.如果上个问题的回答是肯定的,那我该如何得到关于cp的各种退出状态.cp的手册页里好象没有相关说明.

老调重弹--问system返回值

第二个问题我测试了一下,回答是肯定的.
exit status等于被调用程序的用exit(n)或者return n
给出的值.

第一个问题还是不知道.
我在被调用程序运行过程中将他kill掉.
程序还是打印exit normal!可是status取到的值明显是不对的.
faint

老调重弹--问system返回值

UP

老调重弹--问system返回值

WIFEXITED(status)
              returns true if the child terminated normally, that is, by call-
              ing exit() or _exit(), or by returning from main().

老调重弹--问system返回值

楼上的兄弟谢谢了.
我不明白的正是这个问题.

按照上面的描述,我把被调用的进程kill掉.按照我的理解
WIFEXITED(status)不应该返回真才对.

老调重弹--问system返回值

没有人知道吗?

老调重弹--问system返回值

man里面说-->

不管你有没有hello.c文件。你的system都会正常结束,也就都不会返回-1,区别只是cp动作的结束状态不同。

老调重弹--问system返回值

-->

是的,这个我知道,
我现在想知道的是什么情况下
WIFEXITED(status)不会返回真.
我不明白为什么我把被调用的进程中间KILL掉这个宏的值还是真.
但是WEXITSTATUS(status)的值明显不是被调用进程的返回值.

老调重弹--问system返回值

你怎么kill掉的呢?cp之间你kill它?^_^,我也不太明白。

老调重弹--问system返回值

[code]

#include <stdio.h>;
#include <stdlib.h>;
#include <sys/wait.h>;
#include <sys/types.h>;

int main()
{
    
   pid_t status ;
    
   errno = 0 ;
   status = system("./hi") ;
      
   if (status == -1)
      printf("system error!") ;
    
   if (WIFEXITED(status)){
      printf("process exit normal![%d]\n", errno) ;
      printf("exit staus = [%X]\n", WEXITSTATUS(status)) ;
   }else
      printf("process exit illegal![%d]\n", errno) ;
}

[/code]

[code]
int main()
{
   printf("HI!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n") ;
   sleep(20) ;
   return 4 ;
}


[/code]

这样就可以做到在运行中把进程"hi"kill掉了.
如过是正常退出WEXITSTATUS(status)的值是4
如果是KILL掉
WIFEXITED(status)J还是真,但是WEXITSTATUS(status)的值却是86
这个86真让人faint.

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/980/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!

评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]