关于在Linux 编程下的没有控制终端(子进程调用setsid() 后)的问题
2015-11-18 来自:唯J 1 人回应
#include <stdio.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <signal.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>

inline void err_que(const char *msg)
{
        puts(msg);
        exit(0);
}

inline void err_sys(const char *msg)
{
        printf("%s : %s \n", msg, strerror(errno));
        exit(0);
}

void signo(int sig);

int main()
{
        int pid;
        char buf[20];
        int len;

        signal(SIGCHLD, signo);
        signal(SIGTTOU, signo);
        signal(SIGTTIN, signo);

        if((pid = fork()) == -1)
                err_sys("fork error");

        else if(pid == 0)// 子进程
        {

                // 显示进程的一般信息

                printf("my pid : %d\n", getpid());
                printf("my ppid : %d\n", getppid());
                printf("my sid : %d\n", getsid(0));
                printf("the front is  : %d\n", tcgetpgrp(STDOUT_FILENO));
                printf("the front sid : %d\n", tcgetsid(STDOUT_FILENO));

                // 建立一个新的会话 
                // 必须不是一个进程的进程组的组长, 建立成功后不分配控制终端
                // 建立新会话后,该进程成为新进程组的组长进程,并且成为新会话>的会话首进程
                setsid();
        //      open("dev/tty", O_RDWR);

                // 向前台终端发送消息
                fgets(buf, 20, stdin);
                fputs(buf, stdout);
        //      sleep(15);

                exit(0);
        }
        // 父进程 
        while(1)
                pause();
        return 0;
}


void signo(int sig)
{
        int status;

        if(sig == SIGCHLD)
        {
                waitpid(-1, &status, WCONTINUED | WUNTRACED | WNOHANG);

                if(WIFEXITED(status))
                {
                        printf("子进程正常终止 : %d\n", WEXITSTATUS(status));
                        exit(0);
                }
                else if(WIFSIGNALED(status))
                {
                        printf("子进程接受到信号终止 : %d\n",WTERMSIG(status));
                        exit(0);
                }
                else if(WIFSTOPPED(status))
                        printf("子进程已经暂停 : \n", WSTOPSIG(status));
                else if(WIFCONTINUED(status))
                        printf("子进程暂停后已经继续 ....\n");
        }
        else if(sig == SIGTTOU) // 写控制终端
        {
                printf("%d 尝试写控制终端\n", getpid());
        }
        else if(sig == SIGTTIN)
        {
                printf("%d 尝试读控制终端\n", getpid());
        }
}

 

 我想问的是为什么没有控制终端的进程还能正常输入输出??

2015-11-20 来自:风华少年

输入输出使用的都是文件描述符012

您的回应

你还未登陆,不能回应!登陆