首页 > 系统相关 >Linux多进程09-匿名管道实现ps aux

Linux多进程09-匿名管道实现ps aux

时间:2023-05-17 18:45:55浏览次数:46  
标签:ps 14 0.0 09 Linux 进程 aux include

/*
    实现 ps aux | grep xxx
    父子进程间通信

    子进程 : ps aux, 子进程结束后将数据发送给父进程
    父进程 : 获取到数据,guolv

    pipe()
    execlp()
    子进程将标准输出 stdout_fileno 重定向到管道的写端 dup2()

*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <wait.h>

int main(int argc, char const *argv[])
{
    //创建一个管道
    int fd[2];
    int ret = pipe(fd);

    if (ret == -1)
    {
        perror("pipe err");
        exit(0);
    }

    //创建子进程
    pid_t pid = fork();
    if (pid > 0)
    {
        //父进程 读
        //关闭写端
        close(fd[1]);
        //从管道中读取
        char buf[1024] = {0};
        int len = -1;
        while (len = read(fd[0], buf, sizeof(buf) - 1) > 0)
        {
            //过滤数据输出
            printf("%s", buf);
            memset(buf, 0, 1024);
        }
        wait(NULL); // 回收子进程的资源
    }
    else if (pid == 0)
    {
        //子进程 写
        //关闭读端
        close(fd[0]);
        //文件描述符重定向
        dup2(fd[1], STDOUT_FILENO);
        //执行 ps aux
        execlp("ps", "ps", "aux", NULL);
        perror("execlp err");
        exit(0);
    }
    else
    {
        perror("fork err");
        exit(0);
    }

    return 0;

运行:

./pci
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.5 167416 11204 ?        Ss   14:44   0:08 /sbin/init splash
root           2  0.0  0.0      0     0 ?        S    14:44   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   14:44   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<   14:44   0:00 [rcu_par_gp]
root           5  0.0  0.0      0     0 ?        I<   14:44   0:00 [netns]
root           7  0.0  0.0      0     0 ?        I<   14:44   0:00 [kworker/0:0H-events_highpri]

标签:ps,14,0.0,09,Linux,进程,aux,include
From: https://www.cnblogs.com/anqwjoe/p/17409733.html

相关文章

  • Linux多进程08-进程间通信与管道
    进程间通信进程是一个独立的资源分配单元,不同进程(这里所说的进程通常指的是用户进程)之间的资源是独立的,没有关联,不能在一个进程中直接访问另一个进程的资源。不同的进程需要进行信息的交互和状态传递(如:数据传输/通知事件/资源共享/进程控制),因此需要进程间通信(IPC:Int......
  • Linux多进程11-内存映射
    内存映射(Memory-mappedI/O)是将磁盘文件的数据映射到内存,用户通过修改内存就能修改磁盘文件。mmap#include<sys/mman.h>void*mmap(void*addr,size_tlength,intprot,intflags,intfd,off_toffset);功能:将一个文件或者设备的数据映射到内存中参数:......
  • Linux多进程10-有名管道实现简单版聊天功能
    chatA.c//有名管道实现简单版聊天功能#include<unistd.h>#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<stdlib.h>#include<fcntl.h>#include<string.h>intmain(intargc,charconst*argv[]){......
  • Linux多进程13-kill,raise,abort函数
    #include<sys/types.h>#include<signal.h>intkill(pid_tpid,intsig);-功能:给某个进程pid,发送某个信号sig-参数:-pid:>0:将信号发送给指定的进程=0:将信号发送给当前的进程组=-1:将信号发送给每一个......
  • Linux多进程12-信号
    信号概念信号是Linux进程间通信的最古老的方式之一,是事件发生时对进程的通知机制,有时也称之为软件中断,它是在软件层次上对中断机制的一种模拟,是一种异步通信的方式。信号可以导致一个正在运行的进程被另一个正在运行的异步进程中断,转而处理某一个突发事件。发往进程的诸多信......
  • Linux多进程01-进程概述
    程序与进程程序是包含一系列信息的文件,这些信息描述了如何在运行时创建一个进程进程是正在运行的程序的实例。是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。......
  • linux-ubuntu安装 lrzsz
    ubuntu安装lrzsz方法1:二进制包自动安装sudoapt-getinstalllrzsz方法2:源码包手动安装2.1下载cd/server/toolswgethttps://www.ohse.de/uwe/releases/lrzsz-0.12.20.tar.gztar-xzflrzsz-0.12.20.tar.gzcdlrzsz-0.12.20./configure--prefix=/usr/local/lrzszs......
  • Linux 内存管理 pt.3
    哈喽大家好,我是咸鱼在《Linux内存管理pt.2》中我们学习了多级页表和大页,我们知道了由于历史遗留的问题,Linux的页通常为4KB这样就会导致一个页表里面会有特别多页,为了解决这个问题,Linux提供了两种解决方案——多级页表和大页那么今天继续我们的Linux内存管理学习,我们今天......
  • linux-安装系统Ubuntu Server 14.04,16.04和17.10
    安装系统UbuntuServer14.04,16.04和17.10 本文以14.04位案例进行安装,其他版本相关问题会做注解1.选择要安装的系统语言本界面建议选择English,之后再选择中文安装对于14.x版本选择中文没有问题,但是对于16.04和17.10版本,该步骤选择中文后面会报错:2.选择安装过程中需要的语......
  • excel-09-Excel函数由浅入深-逻辑函数
    逻辑函数定义:根据指定的条件进行判断,如果一个条件满足,就给出结果。公式描述AND并且(同时满足)OR或者(满足其中一个)IF逻辑判断AND/OR/IF(logical1,[logical2,...])​ logical1必需,需要检验的第一个条件​ logical2可选,需要检验的其他条件......