求教:关于进程id的问题。

发布于 2022-07-21 17:54:27 字数 1826 浏览 7 评论 5

这段时间一直在研究进程id,进程组id,以及会话id的问题。得出一些结论,希望高手看看对不对。
下面是一个程序。

  1. #include <unistd.h>
  2. #include <sys/types.h>
  3. mian()
  4. {
  5. pid_t pid;
  6. if((pid=fork())==0)
  7. {
  8.     setsid();
  9.     printf(“I’m a child,my id is %dn”,getpid());
  10.   printf(“My group id is %dn”,getpgid(0));
  11.     printf(“My father id is %dn”,getppid());
  12.     printf(“My session id is %dn”,getsid(0));
  13. }
  14. else
  15. {
  16.     printf(“I’m a father,my id is %dn”,getpid());
  17.   printf(“My group id is %dn”,getpgid(0));
  18.     printf(“My father id is %dn”,getppid());
  19.     printf(“My session id is %dn”,getsid(0));
  20. }
  21. }

复制代码

运行这个程序:

  1. [liuning@LINUX liuning]$ ./getsid
  2. I’m a child,my id is 17597
  3. My group id is 17597
  4. My father id is 17596
  5. My session id is 17597
  6. I’m a father,my id is 17596
  7. My group id is 17596
  8. My father id is 17564
  9. My session id is 17564

复制代码

然后变换到超级用户

  1. [liuning@LINUX liuning]$ su root
  2. Passeord:
  3. [lroot@LINUX liuning]$ ./getsid
  4. I’m a child,my id is 17626
  5. My group id is 17626
  6. My father id is 17625
  7. My session id is 17626
  8. I’m a father,my id is 17625
  9. My group id is 17625
  10. My father id is 17601
  11. My session id is 17564

复制代码
可以看到在使用命名su之前,father进程的父进程id是17564和进程的会话id一样。我知道shell是用fork函数复制一个自己来执行命令的,这个17564进程就应该是shell进程。也就是该会话的首进程。
然后我们在来看看使用su命令之后,father进程的父进程id变成了17601,会话id不变,他不再是会话ID。
我想问一下father进程的父进程还是不是shell进程了。如果不是它是什么呢,是由谁创建的呢。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

空心空情空意 2022-07-27 06:20:54

顶起来,等待中.

故事和酒 2022-07-27 06:11:45

谁来帮帮我啊。

腻橙味 2022-07-27 04:42:19

2。you're right

清晨说晚安 2022-07-27 04:06:04

1.我只想了解一下系统的执行流程,所以关于出错处理的东西就没写。(打代码累啊)
2。getpgid(0)表示返回当前进程的进程组ID。我用的也是Redhat 9.0不知道你怎么通不过。
3。哈哈这个不清楚,要查一查了。
4。这个函数返回会话ID也进程会话首进程的ID。

一枫情书 2022-07-25 10:43:41

我是新手,说一下我的理解:

1。fork()返回值是有三种的:-1,0,子进程ID
-1表示创建不成功。你的程序没有考虑这一点。

2。getpgid(void),在我的机子(Redhat9.0)上,有0的话,编译不过去

3。ppid是在main()之后就会有的,我是这样理解的

4。session id不清楚

[ 本帖最后由 huachong 于 2006-9-11 09:09 编辑 ]

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文