linux iapp 进程,Linux进程原语

Linux进程原语及功能:

fork:创建一个新的子进程;

exec族(execl、execlp、execle、execv、execvp、execve):

执行一个文件;

用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。

当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。

调用exec并不创建新进程,所以调用exec前后该进程的pid并未改变。

wait族(wait、wait3、wait4、waitpid):等待子进程终结,以使父进程回收其子进程.

进程从创建到最终被回收过程的简易图示:

6c74774c21a2

进程创建与消亡流程

父进程调用fork系统调用创建子进程 ;

-> 子进程调用exec系统调用来执行其他代码 ;

-> 子进程执行完代码后退出,等待父进程回收,此时的子进程处于僵死状态(使用ps命令依然可以查看得到,但是已经不能运行);

-> 父进程调用wait函数回收子进程,但是如果父进程在子进程结束前就结束了,则子进程在结束运行后将成为孤儿进程,并最终被init进程认领并回收。

代码示例 process.c

#include

#include

#include

int main()

{

pid_t pid;

pid = fork();

if (pid > 0) { /* in parent */

printf("I am parent\n");

exit(0);

}

else if (pid == 0) { /* in child */

printf("I am child\n");

execl("/home/slot/print_args", "print_args", "haha", NULL);

}

else {

perror("fork error");

exit(-1);

}

printf("Hello world\n");

return 0;

}

其中 print_args.c 的功能是打印命令行参数,代码如下:

#include

int main(int argc, char const *argv[])

{

int i = 0;

while (i < argc)

printf("%s\n", argv[i++]);

/* 此处故意将返回值设置为233以便于观察区别 */

return 233;

}

执行结果

$ gcc print_args.c -o print_args

$ gcc process.c -o process

$

$ ./process

I am parent

I am child

print_args

haha

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值