linux c 进程编程,linux c/c++ 编程之-----进程操作

进程

系统调用 getpid 可以得到进程的 ID,而 getppid 可以得到父进程(创建调用该函数进程的进程)的 ID.

#include ;

pid_t getpid(void);

pid_t getppid(void);

struct passwd {

char *pw_name; /* 登录名称 */

char *pw_passwd; /* 登录口令 */

uid_t pw_uid; /* 用户 ID */

gid_t pw_gid; /* 用户组 ID */

char *pw_gecos; /* 用户的真名 */

char *pw_dir; /* 用户的目录 */

char *pw_shell; /* 用户的 SHELL */

};

#include ;

#include ;

进程的创建

#include ;

pid_t fork();

当一个进程调用了 fork 以后,系统会创建一个子进程.这个子进程和父进程不同的地方只有他的进程 ID 和父进程 ID,其他的都是一样.就象符进程克隆(clone)自己一样.

当然创建两个一模一样的进程是没有意义的.为了区分父进程和子进程,我们必须跟踪 fork 的返回值. 当 fork 掉用失败的时候(内存不足或者是用户的最大进程数已到)fork 返回-1,否则 fork 的返回值有重要的作用.对于父进程 fork 返回子进程的 ID,而对于 fork 子进程返回 0.我们就是根据这个返回值来区分父子进程的. 父进程为什么要创建子进程呢?前面我们已经说过了 Linux 是一个多用户操作系统,在同一时间会有许多的用户在争夺系统的资源.有时进程为了早一点完成任务就创建子进程来争夺资源. 一旦子进程被创建,父子进程一起从fork 处继续执行,相互竞争系统的资源.有时候我们希望子进程继续执行,而父进程阻塞直到子进程完成任务.这个时候我们可以调用 wait 或者 waitpid 系统调用.

#include ;

#include ;

pid_t wait(int *stat_loc);

pid_t waitpid(pid_t pid,int *stat_loc,int options);

wait 系统调用会使父进程阻塞直到一个子进程结束或者是父进程接受到了一个信号.如果没有父进程没有子进程或者他的子进程已经结束了 wait 回立即返回.成功时(因一个子进程结束)wait 将返回子进程的 ID,否则返回-1,

父进程创建子进程后,子进程一般要执行不同的程序.为了调用系统程序,我们可以使用系统调用 exec 族调用.exec 族调用有着 5 个函数.

#include ;

int execl(const char *path,const char *arg,...);

int execlp(const char *file,const char *arg,...);

int execle(const char *path,const char *arg,...);

int execv(const char *path,char *const argv[]);

int execvp(const char *file,char *const argv[]):

exec 族调用可以执行给定程序

如果在 Linux 下编写一个"常驻内存"的程序却是很容易的.我们只要几行代码就可以做到.

实际上由于 Linux 是多任务操作系统,我们就是不编写代码也可以把一个程序放到后台去执行的.

我们只要在命令后面加上&符号 SHELL 就会把我们的程序放到后台去运行的.

后台进程的创建思想: 首先父进程创建一个子进程.然后子进程杀死父进程 信号处理所有的工作由子进程来处理.

1、调用fork函数,创建一个子进程。

2、先让父进程自然结束。

3、在子进程中调用setpgrp(),把子进程的进程组ID设为子进程的进程ID。

4、在子进程中调用setsid(),创建一个新的Session(会话),这样子进程就与当前的控制终端脱离,也接受不到当前终端的(ctrl + c)消息。

/*

* Author: ACb0y

* FileName: main.cpp

* Create Time: 2011-07-24

* Version: V1.0

*/

#include

#include

using namespace std;

void print()

{

int pid = getpid();

int gid = getpgid(0);

cout << "process group id = " << gid << endl;

cout << "process id = " << pid << endl;

}

int main()

{

//create a child process.

int pid = fork();

if (-1 == pid)

{

cout << "call function fork() error!" << endl;

}

else if (0 == pid) //return from child process.

{

cout << "----------in child process.----------" << endl;

print();

cout << "--------------------------------------" << endl;

//将该进程的进程组ID设置为该进程的进程ID。

setpgrp();

cout << "----------in child process. setpgrp()----------" << endl;

print();

cout << "--------------------------------------" << endl;

//创建一个新的Session,断开与控制终端的关联。也就是说Ctrl+c的触发的SIGINT信号,该进程接收不到。

setsid();

//后台的内容 for (int i = 0; i < 5; ++i)  { sleep(20); cout << "----------in child process.----------" << endl; print(); cout << "--------------------------------------" << endl; } } else //return from parent process. { cout << "----------in parent process.----------" << endl; print(); cout << "--------------------------------------" << endl; } return 0; }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/244619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pcm 采样率转换_All Video Converter Pro for mac(音视频格式转换器)

视频格式不支持播放&#xff1f;macz为您介绍一款可以快速简单地将视频和音频文件转换为所有流行的格式。支持几乎所有的视频和音频格式&#xff0c;同时还可以裁剪视频&#xff0c;剪辑任何片段&#xff0c;将多个文件合并为一个&#xff0c;并 在视频上添加水印。All Video C…

qt中如何模拟按钮点击_qt – 在Windows中模拟鼠标按钮单击

这是在C#中,但可能会帮助您了解一下&#xff1a;[DllImport("user32.dll",CharSetCharSet.Auto,CallingConventionCallingConvention.StdCall)]public static extern void mouse_event(long dwFlags,long dx,long dy,long cButtons,long dwExtraInfo);private const …

linux监控哪些目录,linux管理文件和目录的命令

1.1 pwd命令该命令的英文解释为print working directory(打印工作目录)。输入pwd命令&#xff0c;Linux会输出当前目录。1.2 cd命令cd命令用来改变所在目录。cd / 转到根目录中cd ~ 转到/home/user用户目录下cd /usr 转到根目录下的usr目录中————-绝对路径cd test 转到当前…

input change获取改变之前的值和改变之后的值_科技改变游戏:玩家使用氛围灯追踪角色资源变化...

来自Reddit上的一位名叫Minokar的玩家&#xff0c;最近通过连接支持Wifi的LED智能灯&#xff0c;提出了一个巧妙追踪魔兽世界角色资源的办法。通过他的设计&#xff0c;这种智能氛围灯会根据角色的怒气、能量、连击点数或者当前的生命值来改变颜色和光的强度。他同时也发布了自…

红外传感器型号和参数_红外传感器参数|热释电红外传感器参数

宇宙间的任何物体只要其温度超过零度就能产生红外辐射&#xff0c;事实上同可见光一样&#xff0c;其辐射能够进行折射和反射&#xff0c;红外线传感器是用红外线的物理性质来进行测量的传感器。红外线又称红外光&#xff0c;它具有反射、折射、散射、干涉、吸收等性质。它是一…

linux 恢复boot分区,Linux boot分区格式化后恢复 示例

在之前的博客我们看了boot分区删除文件后的修复方法&#xff0c;如下&#xff1a;Linux boot 分区损坏重建 示例https://www.cndba.cn/dave/article/3534https://www.cndba.cn/dave/article/3535我们这里看一下直接把boot分区删除后的修复过程。 具体步骤如下。https://www.cnd…

netlink怎么读_内核交互 netlink,检测部分进程死亡和启动。

和内核交互netlinknetlink内核和用户进程交互用户空间用的是socket&#xff0c;内核空间用的是内部API和一个模块。向下兼容。面向数据包的应用。即SOCK_RAW and SOCK_DGRAM函数原型#include #include #include netlink_socket socket(AF_NETLINK, socket_type, netlink_famil…

nosuchelementexception 是什么异常_有甲状腺结节的人为什么越来越多?

有甲状腺结节的人为什么越来越多&#xff1f;甲状腺位于人体颈部正前方的位置&#xff0c;在喉结下方&#xff0c;形似蝴蝶&#xff0c;是人体最大的内分泌腺。甲状腺具有分泌甲状腺激素的功能&#xff0c;该激素在人体生长发育和新陈代谢方面扮演着重要角色。那么&#xff0c;…

hdf5编译+linux,在ubuntu上安装HDF5并编译执行

2.2.解压之后&#xff0c;cd hdf5-1.12.0.tar.gz路径3.按以下顺序在终端执行命令&#xff1a;(1)./configure --prefix/usr/local/hdf5 --enable-fortran(2)make(3) make check(检查环境&#xff0c;可选项)(4)sudo make install(5)sudo make check-install(可选项)至此&#x…

mysql5.7和8.0的区别_解答阿迪达斯Adidas ultra boost4.0与正品区别!如何选择?

随着天气渐热&#xff0c;小伙伴们也该换上清爽的鞋子了。说道这里以舒适,透气&#xff0c;踩屎感的adidas ultra boost或许是中高端鞋品最大的赢家。2年多的时间&#xff0c;adidas已经将UltraBOOST打造成了旗下最出色的慢跑鞋&#xff0c;也将它从1.0升级到了4.0。即便是新品…

开关电源环路的零极点可以在反馈端补偿吗_【干货分享】开关电源环路补偿设计步骤讲解...

微信公众号&#xff1a;硬核电子ps&#xff1a;本文撰写过程较为漫长&#xff0c;要画各种示意图和编辑公式&#xff0c;如果你觉得文章不错的话&#xff0c;就请点个赞同吧。​1. 理论讲解在上一篇文章中电子小白菜&#xff1a;【干货分享】轻松弄懂开关电源TL431环路补偿传递…

python实时监控文件大小_python实现实时监控文件的方法

在业务稳定性要求比较高的情况下&#xff0c;运维为能及时发现问题&#xff0c;有时需要对应用程序的日志进行实时分析&#xff0c;当符合某个条件时就立刻报警&#xff0c;而不是被动等待出问题后去解决&#xff0c;比如要监控nginx的$request_time和$upstream_response_time时…

linux 算法函数,数据结构——算法之(012)( linux C 全部字符串操作函数实现)...

数据结构——算法之(012)( linux C 所有字符串操作函数实现)题目&#xff1a;实现linux C下常用的字符串操作函数题目分析&#xff1a;一、面试中可能经常遇到这样的问题&#xff1a;比如strcpy、memcpy、strstr二、参考了linux 内核代码&#xff0c;对linux大神表示感谢&#…

汇编 begin_【精品】小学作文500字汇编九篇

【精品】小学作文500字汇编九篇在我们平凡的日常里&#xff0c;大家或多或少都会接触过作文吧&#xff0c;作文可分为小学作文、中学作文、大学作文(论文)。你所见过的作文是什么样的呢&#xff1f;以下是小编为大家整理的小学作文500字9篇&#xff0c;希望能够帮助到大家。小学…

linux mkdir绝对路径,linux学习(六)绝对路径、相对路径、cd、mkdir、rmdir、rm(示例代码)...

一、绝对路径就是从根开始的&#xff0c;如&#xff1a;/root、/usr/local。二、相对路径相对于当前路径的&#xff0c;比如我们在当前路径下建立了一个a.txt。[[email protected] ~]# pwd/]# ls1.cap 33.txt Application iptables.bak oneinstack shellscripts1.ipt a.php Doc…

python3.6打包成exe可执行文件、已解决方案_Python 3.6打包成EXE可执行程序的实现...

1、下载pyinstallerpython 3.6 已经自己安装了pip&#xff0c;所以只需要执行 pip install pyinstaller就可以了2、打包程序进入到你你需要打包的目录&#xff1b;比如我在H:\xcyk开始打包&#xff0c;执行pyinstaller xxx.py我们发现&#xff0c;竟然报错&#xff01;&#xf…

steam加速_Apex英雄Steam版锁60帧 GoLink免费加速器助力畅快_综合资讯

之前一度爆火的大逃杀游戏《Apex英雄》最近登录了Steam平台&#xff0c;并且支持与Origin平台数据互通。这让很多被烂橘子平台劝退的玩家选择了在Steam平台重新入坑《Apex英雄》&#xff0c;不过由于Steam版刚推出&#xff0c;免不得出现很多问题&#xff0c;很多玩家在进入游戏…

springboot主线程_Springboot对多线程的支持详解

Springboot对多线程的支持详解这两天看阿里的JAVA开发手册&#xff0c;到多线程的时候说永远不要用 new Thread()这种方式来使用多线程。确实是这样的&#xff0c;我一直在用线程池&#xff0c;到了springboot才发现他已经给我们提供了很方便的线程池机制。本博客代码托管在git…

信号灯文件锁linux线程,linux——线程同步(互斥量、条件变量、信号灯、文件锁)...

一、说明linux的线程同步涉及&#xff1a;1、互斥量2、条件变量3、信号灯4、文件读写锁信号灯很多时候被称为信号量&#xff0c;但个人仍觉得叫做信号灯比较好&#xff0c;因为可以与“SYSTEM V IPC的信号量”相区分(如有不同意见&#xff0c;欢迎探讨)。二、互斥量1、定义互斥…

wpf 大数据界面_24小时删!WPF 界面开发可视化数据源500行代码分享

通过DevExpress WPF Controls&#xff0c;您能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。在本教程中&#xff0c;您将完成可视化数据源所需的步骤。应该执行以下步骤&#xff0c;本文我们将为大…