1.头文件:<stdlib.h>
2.作用:用于调用/bin/sh(一般是一个软链接,指向bash等shell程序) 来执行一条命令。
3.函数原型:int system(const char* command);
其中参数command就是需要读取的命令,函数的返回值表示执行结果,成功一般是0,否则表示失败。
4.实现原理:
system实现的基本原理是fork()一个新的进程出来来执行shell命令,具体过程可以总结为:
(1)fork一个子进程出来
(2)在子进程中调用execl函数来拉起sh执行command命令
(3)使父进程等待子线程执行完毕。
(4)返回出错信息或者子进程执行后的返回值。
5.特点:
(1)在命名执行的过程中信号SIGIN和SIGQUIT是被忽略的,出现这些信号不会对这个子进程产生影响。
(2)返回值取决于执行execl的执行结果,根据返回值不好判断最终的执行结果,而且容易引起系统错误,建议慎用。
(3)每次只能执行一条命令,执行结束后回到父进程,父进程依然在自身的可执行文件的目录下。例如:
/home/0目录下有一个可执行文件test和一个目录testDir,可执行文件中只执行一下两行代码:
system(“cd testDir”); //进入testDir目录
system(“ls -l”); //显示当前目录文件
以上两行代码执行后只会显示程序的可执行文件的所在目录的文件列表,即 test和testDir这两个文件和文件夹的信息。
6.如果程序想要对非当前目录下的文件做操作,需要首先确定需要操作的文件的所在目录是否有足够的操作权限: r-4,w-2,x-1,如果权限不够,需要先用chmod修改权限。请注意:
(1)想要cd进这个目录,user必须对目录有可执行权限x
(2)想要ls目录内的文件,user必须有可读权限r
然后可以选择将文件拷贝到当前目录来进行操作,也可以选择在system()的参数中用“\n”来区分多条命令,通过子进程来完成整个操作。
所以一般步骤是:
(1)system(“chmod 777 testDir”); //修改权限
(2)system(“cd testDir \n ls -l”); //进入testDir并且列出所有文件信息。