1,linux进程操作
1.1 函数system
【调用fork】
system()会调用fork()产生子进程,由子进程来调用/bin/sh -c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。
函数原型:
int system(const char * string);
参数说明:
string:命令
int:返回值
=-1:出现错误
=0:调用成功但是没有出现子进程
>0:成功退出的子进程的id(=127表示system()在调用/bin/sh时失败)
1.2 函数exec
【替换进程映像】
exec家族一共有六个函数,分别是:
int execl(const char *path, const char *arg0, ...... ,(char*)0);
int execlp(const char *file, const char *arg0, ......,(char*)0);
int execle(const char *path, const char *arg0, ......,(char*)0,char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char * const argv[]);
int execve(const char *filename, char *const argv[], char *const envp[]);
1,其中只有execve是真正意义上的系统调用,其它都是在此基础上经过包装的库函数。
2,几个字母:
"l"代表 list即表示以list形式给出,但最后要加一个空指针,如果用常数0来表示空指针,则必须将它强行转换成字符指针,否则有可能出错。
"v"代表 vector即矢量,
"p"代表通过PATH环境变量来查找新程序的可执行文件路径,
"e"代表可以传入一个环境变量envp。
3,示例程序:
char *argv[]={“ls”,”-l”,(char *)0} //先定义一个指针数组
if (execv(“/bin/ls”,argv)) < 0)
{
perror(“execl error!”);
}
#include <unistd.h>
main()
{
char * const ps_argv[]={"ps","-ux",(char*)0};
char * const ps_envp[]={"PATH=/bin:/usr/bin","TERM=console",(char*)0};
//以下任选一种
execl("/bin/ps","ps","-ux",(char*)0);
execlp("ps","ps","-ux",(char*)0);
execle("/bin/ps","ps","-ux",(char*)0,ps_envp);
execv("/bin/ps",ps_argv);
execvp("ps",ps_argv);
execve("/bin/ps",ps_argv,ps_envp);