system执行shell命令

system - execute a shell command

#include <stdlib.h>

int system (const char *command);

描述

The system() uses fork to create a child process that executes a command specified in command using execl as follows:

execl("/bin/sh", "sh", "-c", command, (char *) 0);

and returns after the command has been completed.

During excution of the comman, SIGCHLD will be bocked, and SIGINT and SIGQUIT will be ignored.

If command is NULL, the system() returns a status indicating whether a shell is available on the system.

注意:system在执行完command后才会返回。易造成system进程阻塞,可在command后增加&,以让system立即返回。

返回值

》假如command是NULL,非零值指示shell(执行cmd的/bin/sh)可用,0指示shell不可用。一般情况都返回非0(NULL时),因为系统shell可用。

》假如chilid进程创建失败(fork失败),或child进程状态不能获取(不知fork进程是否创建成功,如内存不足等或未知原因),返回-1。一般不会出现此情况,但应判断此异常情况,判断返回值不为-1。

》假如shell不能在child子进程中执行,此时类似子进程调用_exit(127)退出。比如执行的shell命令不存在。system返回0x7F00(32512),shell退出代码为127.

》system调用成功,返回值是执行command的shell的结束状态(shell的退出状态是shell执行的最后command的终止状态)。

最后两情况,返回值是“wait status"。wait status可以用waitpid宏检测(如WIFEXITED(),WEXITSTATUS()等)。

system() does not affect the wait status of any other children.

注意

As mentioned, system() ignores SIGINT and SIGQUIT. This may make programs that call it from a loop uninterruptible, unless they take care themselves to check the exit status of the child. E.g.

  while(something) {

    int ret = system("foo");

    if(WIFSIGNALED(ret) && (WTERMSIG(ret) == SIGINT || WTERMSIG(ret) == SIGQUIT))

      break;

  }

It is possible for the shell command to return 127, so that code is not a sure indication that the execve call failed.

一般应用举例(system执行时,fork必须成功(不能返回-1);一般shell成功返回0,判断不为0退出):

ret = system(cmd);

if(ret < 0){

  exit (1); 

}


if(WEXITSTATUS(ret) != 0){

  printf("cmd failed.\n");

  exit(1);

}

system立刻返回的举例:

#include <stdio.h>
#include <stdlib.h>
#include <wait.h>

#define CMD "./hao.sh&"

int main(int argc, char *argv[])
{

    int ret = 0;
    if(argc == 1){ 
        ret = system(CMD);
//      ret = system(NULL);
    } else {
        ret = system(argv[1]);
    }   

    printf("return:%d\n", ret);
    if(ret == 0){ 
        printf("Success\n");
    } else {
        printf("Fail\n");
        if(WIFEXITED(ret)){
            printf("error status:%d\n", WEXITSTATUS(ret));
        }   
        if(WIFSIGNALED(ret)){
            printf("error signal:%d\n", WTERMSIG(ret));
        }   
    }   
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值