系统编程(2)

2017-01-04  本文已影响42人  酸菜牛肉

进程的创建
fork(),当返回值为0时,代表为子进程,当返回值为1时,代表为父进程。。用以区分子父进程的作用。。

#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());
    }     
}

#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);

    if((pid = fork()) == 0)
    {
        signal(SIGINT, SIG_IGN);
        signal(SIGUSR1, child_process_sig_handler);
    
        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函数向指定进程发送指定信号值
        // 注意,信号发送无法传递数据
        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);
    }
}

// 实现原理:当子进程退出时,会向父进程发送SIGCHLD信号,在父进程的SIGCHLD信号处理函数中调用wait函数,防止僵尸进程的产生

注意:本例使用信号异步处理僵尸进程

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


// 信号处理函数能够使用其形式参数接收触发该函数的信号值
void sig_handler(int signo);

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

    srand(time(NULL));
    
    // sigaction
    signal(SIGCHLD, sig_handler);

    while(1)
    {
        pid = fork();
        if(pid == 0)
        {
            printf("child process %d is running...\n",  getpid());
            sleep(rand()%3+1); 
            
            //return 0;
            exit(0); 
        }
        else if(pid > 0)
        {
            sleep(1);
        }
    }

    return 0;
}

// 信号处理函数能够使用其形式参数接收触发该函数的信号值
void sig_handler(int signo)
{
    if(signo == SIGCHLD)
    {
        printf("child process %d is exit!!!\n",
            wait(NULL));
    }
}


#include<stdio.h>
#include<pthread.h>

void *pthread_func(void *arg);

int main(int argc,char *argv[])
{
    pthread_t pthread_id;
    pthread_create(&pthread_id,NULL,&pthread_func,NULL);
    
    printf("hahahaha__main\n");
    
    pthread_join(&pthread_id,NULL);
    
    
    return 0;
}

void *pthread_func(void *arg)
{
    printf("hahaha\n");
    pthread_exit(NULL);
}
上一篇 下一篇

猜你喜欢

热点阅读