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

例子:

 未完待续~~~

 

知识共享许可协议
本文 由 cococo点点 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:cococo点点 http://www.cnblogs.com/coder2012


相关文章
|
27天前
|
Unix Shell Linux
Linux 终端和进程的关系,以及在终端前后台切换进程
Linux 终端和进程的关系,以及在终端前后台切换进程
26 1
|
26天前
|
Shell Linux 调度
【Shell 命令集合 系统管理 】Linux 调整进程优先级 renice命令 使用指南
【Shell 命令集合 系统管理 】Linux 调整进程优先级 renice命令 使用指南
35 0
|
26天前
|
存储 监控 Linux
【Shell 命令集合 系统管理 】⭐⭐⭐Linux 查看当前正在运行的进程信息 ps命令 使用指南
【Shell 命令集合 系统管理 】⭐⭐⭐Linux 查看当前正在运行的进程信息 ps命令 使用指南
40 0
|
26天前
|
存储 Shell Linux
【Shell 命令集合 系统设置 】⭐⭐⭐Linux 限制进程资源 ulimit命令 使用指南
【Shell 命令集合 系统设置 】⭐⭐⭐Linux 限制进程资源 ulimit命令 使用指南
35 0
|
26天前
|
监控 Shell Linux
【Shell 命令集合 系统管理 】⭐⭐⭐Linux 向进程发送信号 kill命令 使用指南
【Shell 命令集合 系统管理 】⭐⭐⭐Linux 向进程发送信号 kill命令 使用指南
31 0
|
24天前
|
消息中间件 Linux 调度
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
63 0
|
6天前
|
算法 Linux 调度
深度解析:Linux内核的进程调度机制
【4月更文挑战第12天】 在多任务操作系统如Linux中,进程调度机制是系统的核心组成部分之一,它决定了处理器资源如何分配给多个竞争的进程。本文深入探讨了Linux内核中的进程调度策略和相关算法,包括其设计哲学、实现原理及对系统性能的影响。通过分析进程调度器的工作原理,我们能够理解操作系统如何平衡效率、公平性和响应性,进而优化系统表现和用户体验。
15 3
|
11天前
|
监控 Linux Shell
初识Linux下进程2
初识Linux下进程2
|
11天前
|
Linux 编译器 Windows
【Linux】10. 进程地址空间
【Linux】10. 进程地址空间
19 4
|
15天前
|
Web App开发 人工智能 Ubuntu
【Linux】Linux启动/查看/结束进程命令(详细讲解)
【Linux】Linux启动/查看/结束进程命令(详细讲解)