LoveStackover的博客

编程小子

Job Control之后续实验(二)

题目一:

设计一段程序,设置子进程的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 : 对笔者上述论述有质疑的,请指正笔者,共同学习,共同进步。

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LoveStackover/article/details/79274740
个人分类: UNIX C编程
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

Job Control之后续实验(二)

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭