进程间通信之socketpair

进程间通信之socketpair

源代码

c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>


int main()
{
    //父子通讯管道
    int m_pipe[2];
    //创建管道
    if(socketpair(AF_UNIX,SOCK_STREAM,0,m_pipe) < 0)
    {   
        printf("create socketpair pipe failed\n");  
        return -1; 
    }   
    
    //建立子进程
    pid_t pid =fork();
    //子进程创建失败
    if(pid <0) 
    {   
        close(m_pipe[0]); 
        close(m_pipe[1]); 
         return -1; 
    }   
    else if(pid == 0)
    {   
        //关闭子进程管道读端
        close(m_pipe[0]);
        //重定向标准输出到子进程管道写端
        dup2(m_pipe[1],STDOUT_FILENO);
        //重定向标准输入到子进程管道写端
        //dup2(m_pipe[1],STDIN_FILENO);
        //关闭子进程管道写端
        close(m_pipe[1]);

        //执行linux命令行
        const char* argv[] = {"ls", "-l","-a", "/home/banting/test/test_dir/",NULL};
        execvp("/usr/bin/ls",(char* const*)argv);
        //子进程结束
        return 0;
    }
    else if(pid > 0)
    {   
        //保存子进程的进程id
        int m_pid = pid;
        //关闭父进程管道的写端
        close(m_pipe[1]);
        //非阻塞等待子进程退出
        while(waitpid(m_pid,NULL,WNOHANG) == 0)
        {
            //睡眠1毫秒
            usleep(1000);
            //读取子进程的输出信息
            char buff[4096] = {0};
            int read_len = read(m_pipe[0],buff,sizeof(buff)-4);
            if(read_len <= 0)
            {
                continue;
            }
            buff[read_len] = '\0';
            //打印子进程输出信息
            printf("print child process output info begin...\n");
            printf("%s\n",buff);
            printf("print child process output info end...\n");
            return 0;
        }
    }

    return 0;
}  

测试

bash 复制代码
[banting@localhost test]$ vim test.cpp 
[banting@localhost test]$ gcc -g test.cpp -o test
[banting@localhost test]$ ./test
print child process output info begin...
total 12
drwxrwxr-x. 2 banting banting   23 Jun 17 09:56 .
drwxrwxr-x. 9 banting banting 8192 Jun 17 10:55 ..
-rw-rw-r--. 1 banting banting    0 Jun 17 09:56 test1.txt

print child process output info end...
[banting@localhost test]$ ls -tlr 

参考文献

sockpair创建双向通信的管道
dup和dup2应用及案例
Linux系统编程之exec函数族

相关推荐
btyzadt17 小时前
Ubuntu中安装Nuclei教程
linux·运维·ubuntu
倔强的石头10618 小时前
【Linux指南】gdb进阶技巧:断点高级玩法与变量跟踪实战
linux·运维
未来之窗软件服务18 小时前
操作系统应用开发(二十三)RustDesk ng反向代理—东方仙盟筑基期
服务器·远程桌面·仙盟创梦ide·东方仙盟·rustdek
山,离天三尺三18 小时前
基于LINUX平台使用C语言实现MQTT协议连接华为云平台(IOT)(网络编程)
linux·c语言·开发语言·网络·物联网·算法·华为云
用户311879455921820 小时前
libopenssl-1_0_0-devel-1.0.2p RPM 包安装教程(openSUSE/SLES x86_64)
linux
未来之窗软件服务21 小时前
操作系统应用开发(二十四)RustDesk 404错误—东方仙盟筑基期
服务器·远程桌面·仙盟创梦ide·东方仙盟·rustdek
waves浪游21 小时前
Linux基本指令(中)
linux·运维·python
zwhy031121 小时前
TCP服务器设计思路
linux·服务器·网络
-水火-21 小时前
【IDE】Linux下使用openocd烧录bin文件
linux·ide·openocd·bin
YongCheng_Liang21 小时前
Linux 基础命令的 7 大核心模块
linux·运维·服务器