进程20170104

作者: Hassan_chao | 来源:发表于2017-01-04 19:33 被阅读9次

进程:
1、进程的五大状态

捕获.PNG

// 练习1:在父进程中为SIGINT信号注册处理函数,然后创建一个子进程,父子进程均进行无限循环,使用Ctrl+c组合键触发SIGINT信号,观察父子进程的执行情况
// 注意:子进程在创建时会copy当前父进程的信号处理方式

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
void sig_handler(int signo);

int main(int argc, char *argv[])
{
    pid_t pid;
    struct sigaction act;
    
    //signal(SIGINT, SIG_IGN);
    //signal(SIGINT, SIG_DFL);
    //signal(SIGINT, sig_handler);
    act.sa_handler = sig_handler;
    //act.sa_handler = SIG_IGN;
    //act.sa_handler = SIG_DFL;
    sigaction(SIGINT, &act, NULL);
    
    pid = fork();
    
    while(1);

    return 0;
}

void sig_handler(int signo)
{
    switch(signo)
    {
        case SIGINT:
            printf("signal SIGINT catched in process %d\n", getpid());
    }     
}

// 练习2:创建一个子进程,子进程进入一个无限循环,模拟每1秒从数据中心取一个数据并处理的过程,直到子进程收到父进程发送过来的SIGUSR1信号,打印子进程pid,并退出

// 父进程:创建子进程之后,循环等待信号的到达,当收到SIGINT(由组合键Ctrl+c模拟)信号之后,向子进程发送一个SIGUSR1信号

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>



pid_t pid;

void parent_process_sig_handler(int signo);

void child_process_sig_handler(int signo);

int main(int argc, char *argv[])
{    
    signal(SIGINT, parent_process_sig_handler);
    signal(SIGCHLD, parent_process_sig_handler);
    printf("first:%d\n",getpid());
    if((pid = fork()) == 0)
    {
        signal(SIGINT, SIG_IGN);
        signal(SIGUSR1, child_process_sig_handler);
        printf("child:%d\n",getpid());
    printf("child->father:%d\n",getppid());
        int client_id = 0;
        
        while(1)
        {    
            client_id = rand()%100+1;
            printf("client %d is in...\n", client_id);
            sleep(1);
            printf("client %d is out...\n", client_id);
        }
    }
    else if(pid > 0)
    {
        while(1);
    }
    else
    {
    }

    return 0;
}

void parent_process_sig_handler(int signo)
{
    switch(signo)
    {
        case SIGCHLD:
        wait(NULL);   
        break;
        case SIGINT:
        // kill函数向指定进程发送指定信号值
        // 注意,信号发送无法传递数据
    printf("before kill:%d\n",getpid());
        kill(pid, SIGUSR1);
        break;
        default:
        break;
    }
}

void child_process_sig_handler(int signo)
{
    if(signo == SIGUSR1)
    {
        printf("child process pid : %d\n", getpid());
        exit(0);
    }
}

相关文章

  • 进程20170104

    进程:1、进程的五大状态 // 练习1:在父进程中为SIGINT信号注册处理函数,然后创建一个子进程,父子进程均进...

  • 20170104

    芊兒~能死心了吗?!!!!

  • 20170104

    今天看了张嘉佳的《从你的全世界路过》中的一篇文章叫摆渡人,感觉受益良多。很多年以前我也做过类似的事情。为了爱情,人...

  • 20170104

    完全都不敢相信已经是2017年,感觉自己年龄在越来越大,但是什么都没有得到。 昨天上班,莫名其妙的就想...

  • 20170104

    善为礼者不相,善为易者不占。我不理解在乎礼的人却没有恻隐心,在乎中庸的人却厚黑,

  • 20170104

    昨晚2点多才睡觉,这几天连续高强度工作,今天已经累趴,但是还得继续坚持,下午又安排了一个要不吃不喝不眠不休的工作:...

  • 20170104

    爸爸喝酒了, 妈妈告诉爸爸, 在你出生前不允许喝酒啦, 怕你提前出来,没人给你服务! 呜呜

  • 20170104

    以一当百 一忍可以抵百勇, 一静可以制百动, 一念可以超百劫, 一心可以做百事。

  • 20170104

    当你发现 很多事并不是你想改变就能改变的时候 就会开始学着尝试不在意不挣扎 人这一生 越来越洒脱 不过是越来越清醒...

  • 20170104

    Ubuntu 14.4 安装 flask 参考过程: 我要采用flask来做一个网络配置,Linux系统采用的是U...

网友评论

    本文标题:进程20170104

    本文链接:https://www.haomeiwen.com/subject/giunvttx.html