Linux系统进程篇(2)

调用 fork 创建进程:

fork函数调用完成后,将生成新的进程,原来的调用进程称为父进程,新生成的进程成为子进程,

最关键的是调用一次竟然有两个返回值,这是原来C语言函数所没有见过的,在父进程里面,返回

值是子进程的ID号,在子进程里面返回值是0,出错返回-1.

 

fork函数调用成功后,产生的子进程继承了父进程的大部分属性,主要包括以下几点:

1.进程的实际用户ID,实际用户组ID,有效用户ID,有效用户组ID

2.进程ID,会话ID,控制终端。

3.当前的工作目录和根目录。

4.文件创建掩码,UMASK

5.环境变量。

 

不能继承的属性:

 

1.进程号

2.子进程用户时间和系统时间,这两个时间初始化为0.

3.子进程的信号处理函数指针组置为空。原来的父进程的信号处理函数都失效。

4.父进程的记录锁。

 

使用注意事项:

父进程已打开的文件描述符号可以在子进程直接使用。没调用一次fork描述符的引用计数加1。关闭描述符

时候多次关闭,直至为0.

 

子进程拷贝了父进程的数据段,包括全局变量,但是父进程和子进程各有一份全局变量的拷贝,不能通过全局变量在父子进程

之间通信,而要通过专门的通信机制。

 

调用exec函数系列函数执行程序

 

exec系统函数并不创建新进程,调用exec前后的两个进程是相同的,exec系列的函数主要是为了清除父进程可执行代码的映像,用新的程序代码覆盖调用exec的进程代码。

如果exec代码执行成功,进程会从新程序的main函数入口开始执行,调用exec函数后除了进程ID保持不变下列属性也不变。

 

进程的父进程ID

实际用户的ID和实际用户组ID

进程组ID,会话ID,和控制终端。

定时器剩余时间

当前工作目录和根目录

文件创建掩码UMASK

进程的信号掩码。

 

调用system命令创建进程。

这个比较方便,system调用的时候,加载外部可执行程序,执行完毕后返回调用进程。system的返回码就是加载外部

函数原型

int system(_consr char *_command);

_command:要加载的外部程序的文件名。

 

返回值:

-1:执行失败,可以通过errno获得信息。

 

127.失败,在system的内部实现中,system首先fork子进程,然后调用exec执行新的shell,shell内部也要执行要执行的程序,如果exec调用失败system返回127.由于要加载的

程序也可能返回127.所以最好先判断errno是否为0

 

其他:执行成功。

 

 

进程的终止:

 

调用exit

exit实现带缓冲的IO操作,_exit实现不带缓冲的操作。

exit位于<stdlib.h>

_exit位于 <unistd.h>

 

 

调用wait等待进程退出

 

一个进程运行时,会向父进程发送SIGCLD信号,父进程收到后,可以选择忽略该信号或者安装信号处理函数处理该信号。而处理该信号就需要wait函数,wait是等待子进程退出

并且获取返回码,通常情况下父进程调用wait等待子进程退出,如果没有任何子进程退出,则wait默认进入阻塞态,直道调用的某个进程退出。

wait系列函数主要有两个

_pit_t wait(_WAIT_STATUS_stat_loc);

_pid_t waitpid(_pid_t_pid,int *_stat_loc,int _options);

位于:sys/wait.h

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: Linux系统编程实战是指在Linux系统上进行实际的编程工作。这包括使用Linux系统提供的库文件,如libpthread.a或libpthread.so文件,来进行多线程编程。使用Linuxthread库需要2.0以上版本的Linux内核及相应版本的C库。\[1\]此外,编写脚本实用工具也是Linux系统管理员日常工作中的重要任务之一。通过编写shell脚本实用工具,管理员可以轻松地完成各种任务,如监测磁盘空间、备份重要文件和管理用户账户等。\[2\]在Linux系统编程中,可以使用C语言编写程序,如在main函数中使用fork()函数创建子进程,并通过判断fork()的返回值来区分父进程和子进程,从而实现不同的功能。\[3\]通过实践和应用,可以提高对Linux系统编程的理解和掌握。 #### 引用[.reference_title] - *1* *3* [Linux下的C编程实战](https://blog.csdn.net/weixin_30608503/article/details/94814359)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Linux shell 脚本编程-实战(一)](https://blog.csdn.net/devalone/article/details/81583886)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值