【问题标题】:How to communicate from children process(exec) with parent through pipe()?如何通过管道()从子进程(exec)与父进程通信?
【发布时间】:2021-12-16 08:26:24
【问题描述】:

我有这两个文件,我使用 exec() 从 main.c 调用 exec.c。据我了解 exec.c 应该继承管道,但它说 exec.c 中没有链接管道。这里有什么问题?

main.c

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

#define die(e)                      \
    do                              \
    {                               \
        fprintf(stderr, "%s\n", e); \
        exit(EXIT_FAILURE);         \
    } while (0);

int main(int argc, char *argv[])
{
    int link[2];
    pid_t pid;
    char foo[4096];

    if (pipe(link) == -1)
        die("pipe");

    if ((pid = fork()) == -1)
        die("fork");

    if (pid == 0)
    {

        dup2(link[1], STDOUT_FILENO);
        close(link[0]);
        close(link[1]);
        execvp("./exec", argv);
        die("execl");
    }
    else
    {

        close(link[1]);
        int nbytes = read(link[0], foo, sizeof(foo));
        printf("Output: (%.*s)\n", nbytes, foo);
        wait(NULL);
    }
    return 0;
}

exec.c

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

int main(int argc, char *argv[])
{
    char a;
    a='A';
    write(link[1],&a,sizeof(a));


    return 0;
}

我只是在练习,想输出从 pipe() 保存的数据

我做错了什么,你能帮我调试一下吗? 蒂亚!

【问题讨论】:

    标签: c linux process fork exec


    【解决方案1】:

    main.c 程序中,您通过子进程的标准输出连接管道。

    这意味着子进程通过其正常的标准输出将信息传递给父进程。

    由此可知exec.c 程序可以这么简单:

    #include <stdio.h>
    
    int main(void)
    {
        printf("A");
    }
    

    更具体地说,您的exec.c 源文件对管道没有任何概念,而且绝对没有关于变量link,并且根本无法构建。

    【讨论】:

    • 如何让它连接到管道上?
    • @newyernar 你已经在这样做了。删除exec.c源文件中main函数的所有内容,并将其替换为答案中显示的单个printf调用。
    • 谢谢,但是如果我不想使用 printf 通过管道发送单个值字符串但以某种方式发送数组怎么办。我该怎么做?
    • @newyernar 只需使用您喜欢的任何函数写入标准输出。使用write,就像在现有示例中一样,然后使用STDOUT_FILENO 作为要写入的描述符。
    猜你喜欢
    • 2011-12-22
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多