LINUX进程学习(二)
1.execl族函数
execl族函数主要拿来作为一个程序调用的函数接口。我们可以在一个程序中调用另外一个程序,调用成功着不继续执行下面的语句。
这里我们主要学习几个函数:
// An highlighted block
NAME
execl, execlp, execle, execv, execvp, execvpe - execute a file
SYNOPSIS
#include <unistd.h>
extern char **environ;
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg,
..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],
char *const envp[]);
我们这里主要讲解第一个、第二个、
第一个函数讲解,我们可以通过这样的思想来通过我们写的函数来调用系统程序或者我们自己写的程序。
excel函数的讲解:
// An highlighted block
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main(void)
{
printf("before execl run!\n");
if(execl("/bin/date","date",NULL,NULL)== -1){
printf("yunyong shibai!\n");
}
printf("after run!\n");
return 0;
}
但是因为我们如果需要找到详细的路径才能使用相关的程序,所以我们需要换另外一种方式,用execlp函数。
// An highlighted block
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main(void)
{
printf("before execl run!\n");
execlp("date","date",NULL,NULL)==-1){
printf("yunxing shibai !\n");
}
printf("after run!\n");
return 0;
}
只需在相关的变量环境中就可以使用。
2.system函数
接下来 我们讲更加高级的函数就是system函数这个函数可高级了。我们只需输入程序名字即可。就可以直接调用,就一个参数,它与exec族函数的区别是它会执行完父进程的程序语句。
// An highlighted block
NAME
system - execute a shell command
SYNOPSIS
#include <stdlib.h>
int system(const char *command);
使用如下:
// An highlighted block
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main(void)
{
printf("before execl run!\n");
if(system("date")==-1){
printf("yunxing shibai !\n");
}
printf("after run!\n");
return 0;
}
3.popen函数
NAME
popen, pclose - pipe stream to or from a process
SYNOPSIS
#include <stdio.h>
FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);
我们可以通过这个函数来进行内容的存储,通过函数的原型我们可以看到这个函数的用法。
// An highlighted block
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main(void)
{
printf("before execl run!\n");
char buff[512];
FILE *fp;
fp = popen("date","r");
int n_write = fread(buff,1,512,fp);
printf("after run!\n");
return 0;
}
以上几程序的运行结果都是:
// 前三个
LS@Embed_Learn:~$ ./jincheng
before execl run!
Mon Feb 8 00:09:53 CST 2021
after run!
LS@Embed_Learn:~$
// 最后一个
LS@Embed_Learn:~$ ./jincheng
before execl run!
the n_write = 29 the buff = Mon Feb 8 00:27:48 CST 2021
LS@Embed_Learn:~$
内容比较简单,后续要是有深入理解 慢慢补充。