用fork()创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。
进程程序替换:替换数据和代码,执行不同逻辑,一旦替换之后,父,子进程代码,数据独立。
主要是创建进程,让子进程去执行命令。
主要有6个调度函数,函数名中p表示传文件名(靠环境变量来看是否存在PATH),没p的需把文件路径传过来,要执行一个程序必须先找到它.
带e表示用自定义环境变量,不带e表示从父进程继承而来的环境变量。
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
int main(int argc,char* argv[])
{
pid_t id;
while(1)
{
printf("[lxj/home]$");
fflush(stdout);
char cmd_str[1024]={0};
ssize_t size=read(0,cmd_str,sizeof(cmd_str)-1);
char cmd[32]={0};
char* my_argv[32];
memset(my_argv,0,sizeof(char*)*32);
int length=strlen(cmd_str)-2;
// printf("%s",cmd_str);
if(size!=-1)
{
int index=0;
while (length >= 0)
{
while (length >= 0&&cmd_str[length]==' ')
{
cmd_str[length--] = 0;
}
while (length >= 0 && cmd_str[length] != ' ')
length--;
my_argv[index++]=cmd_str+length+1;
}
my_argv[index]=NULL;
int i=0;
index--;
for(;i<index;++i,--index)
{
char* tmp=my_argv[i];
my_argv[i]=my_argv[index];
my_argv[index]=tmp;
}
if(strcmp(argv[0],"cd")==0)
{
chdir(my_argv[1]);
continue;
}
}
id=fork();
if(id<0)
perror("fork");
else if(id==0){
execvp(my_argv[0],my_argv);
exit(1);
}
else if(id>0){
pid_t waitPid=waitpid(id,NULL,0);
}
}
return 0;
}
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。