欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > linux通过fork()和execve()调用其他程序在子线程中运行

linux通过fork()和execve()调用其他程序在子线程中运行

2025/5/2 18:36:51 来源:https://blog.csdn.net/m0_54442739/article/details/144221984  浏览:    关键词:linux通过fork()和execve()调用其他程序在子线程中运行

fork()的的使用见上一期

linux C fork()和系统调用文件-CSDN博客

简单说一下fork的作用就是创造一个子进程和当前进程一起执行下面的代码

pid_t fork(void)

execve的作用为:让当前进程内容销毁大部分,重新执行一个程序

int execve (const char *__path, char *const __argv[],
           char *const __envp[])

参数用法

__path :待执行文件路径,可以通过pwd查询当前路径,再加上文件名

*__argv[] :一个由字符串指针组成的数组,该数组最后一位必须是NULL

(猜想用于结束,类似于 while(argv != NULL))

*__envp[] : 环境字符串组,可以通过echo $PATH获取当前终端的环境,字符串格式为格式为"name=value"  和__argv类似,数组结尾必须是NULL

写以下两个程序

子程序:

#include "stdio.h"
#include "unistd.h"#include "stdlib.h"//system头文件#include "fcntl.h"//pid_t 定义头文件int main(int argc, char const *argv[])
{//打印父子id和输入的数据printf("in son program, ppid = %d , pid = %d\n",getppid(),getpid());printf("PATH = ");//打印接收到的环境system("echo $PATH");printf("para num = %d\n",argc);for(int i = 0;i < argc; i++){printf("%s\n",argv[i]);}return 0;
}

父程序:

#include "stdio.h"
#include "unistd.h"#include "fcntl.h"//pid_t 定义头文件int main(int argc, char const *argv[])
{//创建子进程,现在开始下面代码父子进程都会执行pid_t spid = fork();//换成自己的子进程文件路径char path[] = "/home/zsy/Desktop/linux/son";//执行的指令char *argv1[] = {"para1" ,"para2", NULL};//环境char *encv[] = {"PATH=/usr/bin",//一个环境NULL};if(spid == 0)//子进程的pid变量值为0,通过这个来分支父子进程{execve(path, argv1, encv);//可以获取返回值来获取执行结果}else//该进程执行{sleep(1);//停止一下免得该进程执行完了没法看见子程序的父进程//打印父子id和输入的数据printf("in father program,pid = %d\n",getpid());}return 0;
}

编译子程序,再编译父程序,并且运行父程序

执行结果

可以看到环境和参数都被输入到子程序中,由父程序调用,且父程序也执行了自己的程序

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词