zoukankan      html  css  js  c++  java
  • Linux 进程

      进程作为资源分配和调度的基本单元,当进程被引进来后,线程作为系统调度执行的基本单元。

      与进程不同,同一进程的各个线程可以共享资源。

      linux运行中有就绪(Waiting),执行(Running)和停止(Stopped)三种基本状态。此外,linux还会产生一种不受欢迎的状态:僵死(Zombie)状态,通常称为Z状态。处于Z状态的进程已经死亡,但没有释放系统资源,包括内存和一些系统表等。在Linux操作系统中要手动清除处于Z状态的进程。

    #include <stdio.h>
    #include <unistd.h>
    
    int main()
    {
            //获取自身所运行的进程ID
        printf("%d\n",(int)getpid());
            //获取父进程ID
        printf("%d\n",(int)getppid());
    
        return 0;
    }

    创建进程:

    pid_t fork();

    ps命令:确定有哪些进程正在运行以及运行的状态。

    ps a    显示当前终端机的程序
    ps -A   显示所有程序
    ps c    列出程序,并显示详细信息
    ps e    列出程序,显示环境变量
    ps -H   显示树状结构,表示结构之间的相互关系
    ps -N   显示所有程序,除了执行PS终端机下的程序之外
    ps  s   采用程序信号的格式显示程序状况
    ps  u   以用户为主的格式来显示程序状况
    ps  x   显示所有程序,不以终端机来区分

    进程终止:

    pid_t wait(int *status);

    例子:

    //      fork.c
    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    
    int main(int argc, char **argv)
    {
        pid_t child_pid,pid;
        int status;
        
        child_pid=fork();
        switch(child_pid)
        {
            case -1:
                printf("failed!\n");
                break;
            case 0:
                printf("child pid is %d\n",(int)getpid());
                break;
            default:
                printf("child pid is %d, parent pid is %d\n",(int)child_pid,(int)getpid());
                //终止子进程
                pid=wait(&status);
                if(WIFEXITED(status))
                    printf("child process exited with code %d\n",child_pid);
                else
                    printf("child process terminated abnormally!\n");
                break;
        }
        return 0;
    }

    进程间通信:

    在同一台计算机中的进程相互通信的方式主要有:管道(Pipe),信号(Signal),信号量(Semaphpre),消息队列(Message)和共享内存(Shared Memory)。

     信号:

    void (*signal(int signum, void (*handler)(int)))(int)
    //signum指出要设置处理方法的信号
    //handler是要处理的函数
    int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact)
    //signum为信号的值
    //act指定了对特定信号的处理
    //oldact保存原来相应的处理

    可以通过kill -l命令来查看所有信号。

    例子:

    #include<signal.h>
    #include<unistd.h>
    #include<stdio.h>
    #include<sys/time.h>
    
    void signalHandle(int signal)
    {
            switch(signal)
            {
                    case SIGHUP:
                            printf("catch signal:sighup(%d)\n",signal);
                            break;
                    case SIGINT:
                            printf("catch signal:sigint(%d)\n",signal);
                            break;
                    case SIGQUIT:
                            printf("catch signal:sigquit(%d)\n",signal);
                            break;
                    case SIGALRM:
                            printf("catch signal:sigalrm(%d)\n",signal);
                            break;
                    default:
                            printf("unknow signal:%d",signal);
                            break;
            }
    }
    
    int main()
    {
            int sec_delay=5;
            printf("current process id:%d\n",(int)getpid());
    
            signal(SIGINT,signalHandle);
            signal(SIGQUIT,signalHandle);
            signal(SIGALRM,signalHandle);
    
            alarm(sec_delay);
            while(1) pause();
    
            return 0;
    }
    
    //sighup-->ctrl+\
    //sigint-->ctrl+c

    管道:

      管道分为普通管道(Pipe)和命名管道(FIFO)。它们都是通过内核缓冲区按先进先出的方式进行数据传输,管道一端顺序地写入数据,另一端顺序地读入数据。管道是半双工的,要进行双方通信,要建立两个管道。

      主要介绍命名管道:

    int mkfifo(const char* pathname, mode_t mode)
    //pathname为文件路径名
    //mode设置新创建的FIFO文件的文件许可权控制位的值为指定的方式值。
    
    //一般的文件的I/0函数,如read(),write(),close()等,都可以用于FIFO

    例子:

     未完待续~~~

  • 相关阅读:
    [leetcode]791. Custom Sort String自定义排序字符串
    [leetcode]304. Range Sum Query 2D
    [leetcode]339. Nested List Weight Sum嵌套列表加权和
    [leetcode]81. Search in Rotated Sorted Array II旋转过有序数组里找目标值II(有重)
    [leetcode]170. Two Sum III
    [leetcode]341. Flatten Nested List Iterator展开嵌套列表的迭代器
    [leetcode]445. Add Two Numbers II 两数相加II
    Node 连接mysql数据库
    Restful 表述性状态传递
    node Express 框架
  • 原文地址:https://www.cnblogs.com/coder2012/p/2988526.html
Copyright © 2011-2022 走看看