在linux中怎么用子进程执行任务,Linux 创建子进程执行任务

#include int main(void)

{

pid_t pid;char *message;

int n;

pid = fork();

if(pid < 0)

{

perror("fork Failed");

exit(1);

}

if(pid == 0)

{

printf("This is the child process. My PID is: %d. My PPID is: %d.\n",getpid(),getppid());

}

else

{

printf("This is the parent process. My PID is %d.\n",getpid());

}

return 0;

}

代码保存到文件 forkdemo.c 文件中,并执行下面的命令编译:

$ forkdemo.c -o forkdemo

$ ./forkdemo

2a6986579c3d5ff6c8816db92aeedce9.png

fork 函数的特点是 "调用一次,返回两次":在父进程中调用一次,在父进程和子进程中各返回一次。在父进程中返回时的返回值为子进程的 PID,而在子进程中返回时的返回值为 0,并且返回后都将执行 fork 函数调用之后的语句。如果 fork 函数调用失败,则返回值为 -1。函数的返回值设计还是很高明的。在子进程中 fork 函数返回 0,那么子进程仍然可以调用 getpid 函数得到自己的 PID,也可以调用 getppid 函数得到父进程 PID。在父进程中用 getpid 函数可以得到自己的 PID,如果想得到子进程的PID,唯一的办法就是把 fork 函数的返回值记录下来。输出是会发生变化的,可能先打印父进程的信息,也可能先打印子进程的信息。

调用

调用和 fork 系统调用的功能基本相同。vfork 系统调用创建的进程共享其父进程的内存地址空间,但是并不完全复制父进程的数据段,而是和父进程共享其数据段。为了防止父进程重写子进程需要的数据,父进程会被 vfork 调用阻塞,直到子进程退出或执行一个新的程序。由于调用 vfork 函数时父进程被挂起,所以如果我们使用 vfork 函数替换 forkdemo 中的 fork 函数,那么执行程序时输出信息的顺序就不会变化了。

函数执行新的程序。接下来让我们先了解下 exec 族函数。

函数

后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往需要调用一个 exec 族函数以执行另外一个程序。当进程调用 exec 族函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的起始处开始执行。调用 exec 族函数并不创建新进程,所以调用 exec 族函数前后该进程的 PID 并不改变。

函数一共有六个:

#include execl(*path,*execlp(*file,...);execle(*path,*arg,...,*execv(*path,*execvp(*file,*execve(*path,*argv[],*envp[]);

函数名字中带字母 "l" 的表示其参数个数不确定,带字母 "v" 的表示使用字符串数组指针 argv 指向参数列表。函数名字中含有字母 "p" 的表示可以自动在环境变量 PATH 指定的路径中搜索要执行的程序。函数名字中含有字母 "e" 的函数比其它函数多一个参数 envp。该参数是字符串数组指针,用于指定环境变量。调用这样的函数时,可以由用户自行设定子进程的环境变量,存放在参数 envp 所指向的字符串数组中。

调用,其它五个函数最终都调用 execve。这些函数之间的关系如下图所示(此图来自互联网):

f47467a812f3193fa62884ae26c8a2cc.png

函数的特征:调用 exec 族函数会把新的程序装载到当前进程中。在调用过 exec 族函数后,进程中执行的代码就与之前完全不同了,所以 exec 函数调用之后的代码是不会被执行的。

函数实现在子进程中执行 ls 命令:

#include main(((pid=vfork()) < (pid==*argv[ ]={,,*envp[ ]={(execve(,argv,envp) < 退出,要么从上面的 exit(1) 语句退出代码的执行路径永远也走不到这里,下面的 printf 语句不会被执行

printf(

代码保存到文件 subprocessdemo.c 文件中,并执行下面的命令编译:

$ subprocessdemo.c -o subprocessdemo

$ ./subprocessdemo

ca7041efaf31aaeabe19eef9fe76f85d.png

函数和 exec 族函数都是 Linux 系统中非常重要的概念。本文试图通过简单的 demo 来演示这些函数的基本用法,为理解 Linux 系统中父进程与子进程的概念提供一些直观的感受。

《Linux 环境下 C 编程指南》《深入理解 Linux 内核》

总结

以上是编程之家为你收集整理的Linux 创建子进程执行任务全部内容,希望文章能够帮你解决Linux 创建子进程执行任务所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值