目录

前言

一,有名管道通信

1 .概念

2 .创建有名管道

实例代码如下:

二、信号通信

1 .概念

2 .用户进程对信号的响应方式

3. 用户进程对常用信号的缺省操作

4. 信号处理流程

5. 信号相关函数(系统调用)

 5.1 kill - 给指定进程发送信号

实例代码如下: 

5.2 raise() --给当前进程发送信号  

实例代码如下: 

5.3 alarm() 在进程中设置定时器(闹钟)  

实例代码如下: 

5.4 pause() 使进程挂起  

 实例代码如下:

5.5 signal 注册信号  

实例代码如下: 

总结


前言

上篇博客对C/C++进程的中部分进行了详细讲解,本篇博客将继续讲解和补充关于线程的知识点。


一,有名管道通信

1 .概念

2 .创建有名管道

实例代码如下:

//从管道读10个整数,然后排序,并打印
int main(int argc ,char **argv)
{
    int fd;
    int a[10],i,j,flag;
    if(argc != 2){
        fprintf(stderr,"Usage: %s <fifoname>\n",argv[0]);
        exit(1);
    }

    //判断管道文件是否存在,如果不存在则创建,存在则直接打开
    if(access(argv[1],F_OK)){
        //创建有名管道
        if(mkfifo(argv[1],0666) < 0){   //管道权限= 0666 & ~umusk
            perror("mkfifo");
            exit(1);
        }
    }

    //打开管道
    if((fd = open(argv[1],O_RDWR)) < 0){
        perror("open");
        exit(1);
    }

    //从管道中读10个整数
    if(read(fd,a,sizeof(a)) < 0){
        perror("read");
        exit(1);
    }

    //排序
    for(i = 0; i < 9; i++){
        flag = 1;
        for(j = 0; j < 9-i; j++)
            if(a[j] > a[j+1]){
                a[j] = a[j] + a[j+1];
                a[j+1] = a[j] - a[j+1];
                a[j] = a[j] - a[j+1];
                flag = 0;
            }
        if(flag)
            break;
    }
    for(i = 0; i < 10; i++){
        printf("%d  ",a[i]);
        fflush(stdout);
        sleep(1);
    }
    printf("\n");
    close(fd);

    return 0;
}
//从键盘输入10个整数,并写入管道
int main(int argc ,char **argv)
{
    int fd;
    int a[10],i;
    if(argc != 2){
        fprintf(stderr,"Usage: %s <fifoname>\n",argv[0]);
        exit(1);
    }

    //判断管道文件是否存在,如果不存在则创建,存在则直接打开
    if(access(argv[1],F_OK)){
        //创建有名管道
        if(mkfifo(argv[1],0666) < 0){   //管道权限= 0666 & ~umusk
            perror("mkfifo");
            exit(1);
        }
    }

    //打开管道
    if((fd = open(argv[1],O_RDWR)) < 0){
        perror("open");
        exit(1);
    }

    //键盘输入10个整数
    printf("请输入10个整数:");
    for(i = 0; i < 10; i++){
        scanf("%d",&a[i]);
    }

    //向管道中写10个整数
    write(fd,a,sizeof(a));

    close(fd);

    return 0;
}

二、信号通信

1 .概念

2 .用户进程对信号的响应方式

3. 用户进程对常用信号的缺省操作

4. 信号处理流程

 C/C++进程超详细详解【下部分】(系统性学习day8)-LMLPHP

5. 信号相关函数(系统调用)

 5.1 kill - 给指定进程发送信号

实例代码如下: 
int main(int argc,char **argv)
{
#if 1
    pid_t pid;

    if(argc != 2){
        fprintf(stderr,"Usage: %s <pid>\n",argv[0]);
        exit(1);
    }

    pid = atoi(argv[1]);   //atoi将字符串转为整数
    if(kill(pid,SIGKILL) < 0){
        perror("kill");
        exit(1);
    }
#else
    pid_t pid1,pid2;
    int i;

    if((pid1 = fork()) < 0){
        perror("fork");
        exit(1);
    }else if(!pid1){   //子进程1
        for(i = 0; ; i++){
            printf("pid = %d\n",getpid());
            sleep(1);
        }
    }else{
        if((pid2 = fork()) < 0){
            perror("fork");
            exit(1);
        }else if(!pid2){  //子进程2
            for(i = 0; ; i++){
                printf("pid = %d\n",getpid());
                sleep(1);
            }
        }else{  //父进程
            for(i = 0; ; i++){
                printf("pid = %d\n",getpid());
                sleep(1);
                if(i == 5)
                    //kill(0,SIGKILL); //0--给进程组中每一个进程发送信号
                    kill(pid2,SIGKILL);  //给pid2发送信号
            }
        }
    }

#endif
    return 0;
}

5.2 raise() --给当前进程发送信号  

实例代码如下: 
int main(void)
{
    int i;
    for(i = 0; ; i++){
        printf("pid = %d\n",getpid());
        sleep(1);
        if(i == 7)
            raise(SIGKILL);
    }
    return 0;
}

5.3 alarm() 在进程中设置定时器(闹钟)  

实例代码如下: 
int main(void)
{
    int i,ret;

    ret = alarm(20);  // 从该语句开始计时,7秒之后发送SIGALRM信号给当前进程
    printf("ret = %d\n",ret);

    for(i = 0; ; i++){
        printf("pid = %d,i = %d\n",getpid(),i);
        sleep(1);
        if(i == 7){
            ret = alarm(5);
            printf("ret = %d\n",ret);
        }
    }
    return 0;
}

5.4 pause() 使进程挂起  

 实例代码如下:
//信号处理函数
void fun(int signo)
{
    int i;
    for(i = 0; i < 3; i++){
        printf(GREEN "正在吃饭\n"NONE);
        sleep(1);
    }
}

int main(void)
{
    int i,j;

    //注册信号SIGALRM
    signal(SIGINT,fun);


    for(i = 0; ; i++){
        pause();  //使进程挂起,直到收到信号为止
        for(j = 0; j < 5; j++){
            printf("正在睡觉\n");
            sleep(1);
        }
    }
    return 0;
}

5.5 signal 注册信号  

实例代码如下: 
//信号处理函数
void eat(int signo)
{
    int i;
    for(i = 0; i < 3; i++){
        printf(GREEN "正在吃饭\n"NONE);
        sleep(1);
    }
}

int main(void)
{
    int i;

    //注册信号SIGALRM
    signal(SIGALRM,eat);


    for(i = 0; ; i++){
        if(i % 8 == 0){
            alarm(8);  // 从该语句开始计时,7秒之后发送SIGALRM信号给当前进程
            printf("开始睡觉,设置闹钟\n");
        }
        printf("正在睡觉......\n");
        sleep(1);
    }
    return 0;
}


总结

        本篇文章针对进程进行最后的超详细讲解和补充,希望能够帮到大家!

        以后还会给大家展现更多关于嵌入式和C语言的其他重要的基础知识,感谢大家支持懒大王!

       希望这篇博客能给各位朋友们带来帮助,最后懒大王请来过的朋友们留下你们宝贵的三连以及关注,感谢你们!

10-05 11:28