Job Control之后续实验(二)

原创 2018年02月06日 21:26:34

题目一:

设计一段程序,设置子进程的process group id,使其子进程成为该group leader并考虑竞态的发生。

[root@localhost ~]# vim 9_1.c       
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#define handle_error(msg) \
        do { perror(msg); exit(EXIT_FAILURE);} while (0)

int main( int agrc, char ** argv)
{
        pid_t pid[2];

        if((pid[0] = fork()) == -1)
                handle_error("fork");
        if(pid[0] >0 )
        {
                printf("parent process id :%d\n",getpid());
                if(setpgid(pid[0],0) != 0)
                        handle_error("setpgid");
        }
        else
        {
                if(setpgid(0,0) != 0)
                        handle_error("setpgid");
                printf("child process id :%d\n",getpid());
        }
        pid[0]=getpid();
        pid[1]=getpgid(getpid());
        printf("current process id :%d, current process group id:%d\n",pid[0],pid[1]);
        exit(0);
}
[root@localhost ~]# ./9_1
parent process id :1364
current process id :1364, current process group id:1364
[root@localhost ~]# child process id :1365
current process id :1365, current process group id:1365

  这里父子进程谁先执行,都不会影响子程序成为自身组别的group leader。竞态是指父子进程对子进程的组别的设置还未开始,就已经假设该情况发生并进行一些操作。这里很显然没有这种竞态产生。 比较值得注意的一种用法就是 if(setpgid(0,0) != 0)

NOTE: shell提示符只有当父进程结束的时候才能显示出来,可以通过进程关系解释,此处不赘述。^_^

题目二:

setsid 是否会自动的设置调用该函数的进程为the new group’s leader,并且验证其没有control terminal?

#include <unistd.h>
#include <stdio.h>
#include <err.h>
#include <stdlib.h>
#include <fcntl.h>
#include <termios.h>
#define handle_error(msg) \
                do { perror(msg); exit(EXIT_FAILURE);} while (0)

int main( int agrc, char ** argv)
{
        pid_t pid[3];

        if((pid[0] = fork())<0)
                handle_error("fork");
        if(pid[0] >0)
        {
                exit(0);
        }
        else
        {
                int fd;

                if((fd=open("/dev/tty",O_RDWR,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH))<0)
                        handle_error("open");
                pid[0]=setsid();
                pid[1]=getpgid(getpid());
                pid[2]=getsid(getpid());
                if( pid[0] == pid[1]&& pid[1] == pid[2])
                {
                        printf("current process id :%d, current process group id:%d,current session id:%d\n",getpid(),pid[1],pid[2]);
                        pid[0]=tcgetpgrp(fd);
                        printf("current terminal's session leader's group id:%d\n",pid[0]);
                        while(1);
                }

        }
}
[root@localhost ~]# ./9_2
[root@localhost ~]# current process id :1436, current process group id:1436,current session id:1436
current terminal's session leader's group id:-1

[root@localhost ~]# ps -aux | grep 9_2
root       1501 91.3  0.0   4476    80 ?        Rs   21:23   0:09 ./9_2
root       1503  0.0  0.0 119728  1064 pts/1    S+   21:23   0:00 grep --color=auto 9_2

  在if( pid[0] == pid[1]&& pid[1] == pid[2])的语句上就已经证实了题设,结果中正常输出printf的语句,这是因为子进程继承了父进程的打开的文件描述符,这里就是指标准输入输出及错误。(这些文件描述符映射到父进程对应的terminal)然而open打开的control terminal此时并不存在。所以后面打印出来current terminal's session leader's group id:-1。通过ps指令也证实了此时子进程虽然为session leader,但是却并不具有control termianl

2018年2月6号:对于/dev/tty是否是当前进程的控制终端,还存在疑问?如果不是,上面的程序某些判断是不正确的。

NOTE : 对笔者上述论述有质疑的,请指正笔者,共同学习,共同进步。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Job Control后续实验(二)

NOTE :理论部分请戳 [戳我戳我](http://blog.csdn.net/bushipeien/article/details/78843724)题目一: 设计一段程序,设置子进程的pro...
  • bushipeien
  • bushipeien
  • 2017年12月20日 12:12
  • 288

linux——工作管理(job control)

在自己的bash中,如果有多个工作需要处理,就需要进行job control,把其中一些工作可以放进背景中。 直接将指令放到背景中执行 :&将目前的工作放到背景中暂停:ctrl+z观察目前背景工...
  • u012201343
  • u012201343
  • 2015年08月31日 10:17
  • 568

hadoop2:no job control一般解决方法

Hadoop /bin/bash: line 0: fg:
  • LANWENBING
  • LANWENBING
  • 2014年06月23日 12:59
  • 2689

/bin/bash: line 0: fg: no job control一般解决方法

测试版本:CDH5.0,(Hadoop2.3)在使用windows调用Hadoop yarn平台的时候,一般都会遇到如下的错误:2014-05-28 17:32:19,761 WARN org.apa...
  • fansy1990
  • fansy1990
  • 2014年05月29日 15:12
  • 8715

Windows 下/bin/bash: line 0: fg: no job control一般解决方法

hadoop版本2.7.1    在mapred-site.xml中添加配置 mapreduce.app-submission.cross-platform true...
  • espiermerck
  • espiermerck
  • 2016年02月22日 15:12
  • 229

Linux下工作管理Job control小结

1.工作管理          Linux下的工作管理指的是,当我们通过tty*登录系统并取得shell之后,我们在shell下同时进行多个工作的行为管理。   2.工作管理的方式          ...
  • wangjianno2
  • wangjianno2
  • 2014年01月15日 16:28
  • 661

Job for tomcat.service failed because the control process exited with error code 解决办法:

这个问题是在 《 Linux下Tomcat8.5安装与环境配置 》 时遇到的; 错误信息如下: Job for tomcat.service failed because the control p...
  • Hello_World_QWP
  • Hello_World_QWP
  • 2017年12月22日 10:42
  • 445

数据结构实验之排序二:交换排序

数据结构实验之排序二:交换排序 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 冒泡...
  • guoqingshuang
  • guoqingshuang
  • 2015年12月20日 18:55
  • 1697

Centos 7不能上网,Job for iptables.service failed because the control process exited with error code.

一、先检查自己的网络配置信息:路径: vi /etc/sysconfig/network-scripts/ifcfg-eno16777736   如图 重启网络配置的命令:service n...
  • qq_38042891
  • qq_38042891
  • 2017年05月20日 14:21
  • 8679

gitlab搭建提示inet_interfacesJob for postfix.service failed because the control process exited with erro

Job for postfix.service failed because the control process exited with error code. See "systemctl st...
  • u013697959
  • u013697959
  • 2017年09月20日 15:30
  • 180
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Job Control之后续实验(二)
举报原因:
原因补充:

(最多只允许输入30个字)