管道和进程通信

管道和进程通信

说明

lftp是一个linux下的命令行工具,linux操作系统一般都自带这个工具。这个工具可以通过SSH协议和其他多种协议进行文件传输。我写了一个程序启动lftp进程,通过管道给这个进程下达传输指令,获取传输进度,这个程序是一个原理验证性的程序,原理验证之后就可以封装成一个真正能用的工具,可以通过socket和外部通信,命令下达到lftp进程,也可以写成一个动态链接库,JAVA通过JNI编程接口调用这个C程序。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>

int orderdes[2];
int outputdes[2];

void start_client(){

    printf("start client...\n");

    if(dup2(orderdes[0], STDIN_FILENO) == -1)
    {
        printf("dup2 stdin failed\n");
        exit(-1);
    }

    if(dup2(outputdes[1], STDOUT_FILENO) == -1)
    {
        printf("dup2 stdout failed\n");
        exit(-1);
    }

    char *args[4] = {"-f", "-c", "/usr/bin/lftp", NULL};
    int n = execv("/usr/bin/script", args);
    printf("return %d", n);
}

void question()
{
    for(;;)
    {
        char ss[1024] = {0};
        gets(ss);
        strcat(ss, "\n");
        write(orderdes[1], ss, strlen(ss));
    }
}

void output()
{
    for(;;)
    {
        char buffer[1024] = {0};
        read(outputdes[0], buffer, 1024);
        printf(buffer);
    }
}

int main()
{
    if (pipe(orderdes) == -1 || pipe(outputdes) == -1)
    {
        printf("open pipe failed\n");
        exit(-1);
    }

    switch(fork())
    {
        case -1:
            exit(-1);

        case 0:
            start_client();
            break;

        default:

            switch (fork())
            {
                case -1:
                    exit(-1);

                case 0:
                    output();
                    break;

                default:
                    question();
            }
    }

    return 0;
}
lishujun

程序员一枚