我们知道怎么通过fork函数创建(或者说是复制)一个进程,但是我们要怎么样操作这个被创建出来的进程呢?那就需要用到他的进程id,所以就要获取进程id,一下提供一些获取进程id的函数和其使用方法。
  

1)getpid和gteppid

s

#include <sys/types.h>
#include <unistd.h> pid_t getpid(void); //返回调用进程的PID号
pid_t getppid(void); //返回调用进程父进程的PID号 例子: #include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h> int main(void)
{
pid_t pid; printf("this is a test\n");
/*
*上面的语句如果没有\n那么就会在子进程中也打印一句
*这个是由于printf的机制造成的,遇到\n就出栈,
*若没有\n那么会在执行下一条语句的时候前出栈,
*而下一条语句是fork,此时已经复制主进程的环境,其中包括打印
*/
pid = fork();//调用fork时,子进程会从下面的语句开始执行 if(pid > )
{
while()
{
printf("I am parent\n");
printf("parent's pid id %d\n",getpid());
printf("parent's father is %d\n\n",getppid());
sleep();
}
}
else if(pid == )
{
while()
{
printf("I am child\n");
printf("child's pid id %d\n",getpid());
printf("child's father is %d\n\n",getppid());
sleep();
}
}
else
{
perror("fork");
exit();
} return ;
}

输出结果:

this is a test
I am parent
parent's pid id 4040
parent's father is 3348

I am child
child's pid id 4041
child's father is 4040

I am parent
parent's pid id 4040
parent's father is 3348

I am child
child's pid id 4041
child's father is 4040

2)getuid和geteuid

概念补充:
1、实际用户ID和实际用户组ID:标识我是谁。也就是登录用户的uid和gid,比如我的Linux以simon登录,在Linux运行的所有的命令的实际用户ID都是simon的uid,实际用户组ID都是simon的gid(可以用id命令查看)。

2、有效用户ID和有效用户组ID:进程用来决定我们对资源的访问权限。一般情况下,有效用户ID等于实际用户ID,有效用户组ID等于实际用户组ID。当设置-用户-ID(SUID)位设置,则有效用户ID等于文件的所有者的uid,而不是实际用户ID;同样,如果设置了设置-用户组-ID(SGID)位,则有效用户组ID等于文件所有者的gid,而不是实际用户组ID。

#include <unistd.h>
#include <sys/types.h>

uid_t getuid(void); //返回实际用户ID
uid_t geteuid(void); //返回有效用户ID

例子:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h> /*
uid_t getuid(void); //返回实际用户ID
uid_t geteuid(void); //返回有效用户ID
*/
int main(void)
{
printf("实际用户ID = %d\n",getuid());
printf("有效用户ID = %d\n",geteuid()); return ;
}

输出结果:

实际用户ID = 1000
有效用户ID = 1000

3)getgid和getegid

#include <unistd.h>
#include <sys/types.h>
gid_t getgid(void); //返回实际用户组ID
gid_t getegid(void); //返回有效用户组ID

例子:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h> /*
gid_t getgid(void); //返回实际用户组ID
gid_t getegid(void); //返回有效用户组ID
*/
int main(void)
{
printf("实际用户组ID = %d\n",getgid());
printf("有效用户组ID = %d\n",getegid()); return ;
}

输出结果:

实际用户组ID = 1000
有效用户组ID = 1000

进程id的更多相关文章

  1. Linux 内核进程管理之进程ID

    Linux 内核使用 task_struct 数据结构来关联所有与进程有关的数据和结构,Linux 内核所有涉及到进程和程序的所有算法都是围绕该数据结构建立的,是内核中最重要的数据结构之一.该数据结构 ...

  2. C++ Windows 下 根据进程名获取进程ID 以及该进程下所有窗口的句柄

    #include <windows.h> #include <stdint.h> #include <tlhelp32.h> #include <stdio. ...

  3. 如何在脚本中获取进程ID(PID)

    我想要知道运行中脚本子shell的进程id.我该如何在shell脚本中得到PID. 当我在执行shell脚本时,它会启动一个叫子shell的进程.作为主shell的子进程,子shell将shell脚本 ...

  4. dos命令记录以及dos下通过进程id查找工作路径

    dos命令 tasklist |findstr "1696" 通过进程id查看进程名 tasklist 列出所有进程 netstat -ano 查看当前网络通信进程连接的各种状态 ...

  5. C#获取运行程序的进程ID

    C#获取运行程序的进程ID [DllImport("User32.dll", CharSet = CharSet.Auto)] public static extern int G ...

  6. 如何通过进程名获取进程ID

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:如何通过进程名获取进程ID.

  7. Linux 内核进程管理之进程ID 。图解

    http://www.cnblogs.com/hazir/tag/kernel/ Linux 内核进程管理之进程ID   Linux 内核使用 task_struct 数据结构来关联所有与进程有关的数 ...

  8. 通过命令名称查询进程id

    linux 中如何通过命令名称查询出进程的id呢? 例如,我想查询java的进程id: ps -ef |grep java |grep -v grep|awk '{print $2}' 或者: ps ...

  9. ORA-03113: 通信通道的文件结尾 进程 ID: 764 会话 ID: 125 序列号: 5

    昨天因为导入很久数据,最后一看是因为数据文件不够,后来就关机了.现在,开启数据库,总是报“ORA-03113: 通信通道的文件结尾” SQL> conn /as sysdba; 已连接到空闲例程 ...

  10. jstack:将Process Explorer中看到的进程ID做16进制转换,到ThreadDump中加上0x 前缀即能找到对应线程(转)

    原文链接:http://www.iteye.com/topic/1133941 症状: 使用Eclipse win 64位版本,indigo及kepler都重现了,使用tomcat 6.0.39,jd ...

随机推荐

  1. oracle-sql脚本导出EXCEL数据

    在数据库中,经常有业务人员提出需求导出数据库中的业务数据,而且是每天.每周或每月定时导出.为了方便,可将sql查询的脚本 通过下面脚本来导出EXCEL数据. 1.将查询sql脚本(AAA.sql)放到 ...

  2. Angularjs基础(十二)

    ng-model-options 描述:规定如何更新模型 实例: 在失去焦点时绑定输入框的值scope 变量中. <div ng-app="myApp" ng-control ...

  3. 让微信内置浏览器兼容clipboard.js 复制粘贴 ios 安卓

    <!--js copy事件--><script type="text/javascript" src="/static/js/clipboard.min ...

  4. 前后端不分离部署教程(基于Vue,Nginx)

    有小伙伴私信问我vue项目是如何进行前后端不分离打包发布的,那我岂能坐视不管,如此宠粉的我肯定是要给发一篇教程的,话不多说,开始操作 前端假如我们要发布我们的Vue项目,假设我们前端用的是histor ...

  5. symfony 安装使用(一)

    Symfony安装教程网上已经存在很多了,但是这里还是要写一下: 1.symfony 安装有以下几种,对应不同的环境 1.1通过composer 命令安装 composer create-projec ...

  6. 04 mysql 基础三 (进阶)

    mysql 基础三 阶段一 mysql 单表查询 1.查询所有记录 select * from department; ​ select * from student; ​ select * from ...

  7. 004---Linux系统设置

    Linux版本相关命令 查看系统版本:cat /etc/redhat-release 查看系统内核版本以及位数:uname -r [root@hostname1 ~]# cat /etc/redhat ...

  8. Android面试收集录 文件存储

    1.请描述Android SDK支持哪些文件存储技术? 使用SharePreferences保存key-value类型的数据 流文件存储(openFileOutput+openFileInput或Fi ...

  9. SQL Server附加数据库拒绝访问错误解决方法

    今天在MsSQL里附加数据库时提示操作系统错误5(拒绝访问),这里我没给出了两个解决方案供大家解决问题. 方案一:切换登录方式 出现这种情况是由于用“混合验证方式”(SQL Server身份验证)登录 ...

  10. C语言RL78 serial bootloader和C#语言bootloader PC端串口通信程序

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 前段时间完成的hype ...