linux 系统调用函数详解,linux系统调用system()函数详解

一、system()函数功能简介shell

int system(const char *command)

system()函数调用/bin/sh来执行参数指定的命令,/bin/sh 通常是一个软链接,指向某个具体的shell,好比bash,-c选项是告诉shell从字符串command中读取命令; 在该command执行期间,SIGCHLD是被阻塞的,比如在说:hi,内核,这会不要给我送SIGCHLD信号,等我忙完再说; 在该command执行期间,SIGINT和SIGQUIT是被忽略的,意思是进程收到这两个信号后没有任何动做。bash

二、system()函数源码函数

system()函数源码实现:spa

int system(const char * cmdstring)

{

pid_t pid;

int status;

if(cmdstring == NULL)

{

return (1); //若是cmdstring为空,返回非零值,通常为1

}

if((pid = fork())<0)

{

status = -1; //fork失败,返回-1

}

else if(pid == 0)

{

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

_exit(127); // exec执行失败返回127,注意exec只在失败时才返回如今的进程,成功的话如今的

进程就不存在啦~~

}

else //父进程

{

while(waitpid(pid, &status, 0) < 0)

{

if(errno != EINTR)

{

status = -1; //若是waitpid被信号中断,则返回-1

break;

}

}

}

return status; //若是waitpid成功,则返回子进程的返回状态

}

仔细看完这个system()函数的简单实现,那么该函数的返回值就清晰了吧,那么何时system()函数返回0呢?只在command命令返回0时。

三、system()函数返回值debug

system()函数执行了三步操做:code

fork一个子进程;

在子进程中调用exec函数去执行command;

在父进程中调用wait去等待子进程结束。 对于fork失败,system()函数返回-1。 若是exec执行成功,也即command顺利执行完毕,则返回command经过exit或return返回的值。 (注意,command顺利执行不表明执行成功,好比command:"rm debuglog.txt",无论文件存不存在该command都顺利执行了) 若是exec执行失败,也即command没有顺利执行,好比被信号中断,或者command命令根本不存在,system()函数返回127. 若是command为NULL,则system()函数返回非0值,通常为1.

system()函数用起来很容易出错,返回值太多,并且返回值很容易跟command的返回值混淆。这里推荐使用popen()函数替代,关于popen()函数的简单使用能够本身查下资料。进程

popen()函数较于system()函数的优点在于使用简单,popen()函数只返回两个值: 成功返回子进程的status,使用WIFEXITED相关宏就能够取得command的返回结果; 失败返回-1,咱们可使用perro()函数或strerror()函数获得有用的错误信息。ci

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值