【问题标题】:How do I pipe into a third process?如何通过管道进入第三个进程?
【发布时间】:2016-05-05 11:41:03
【问题描述】:

这是我的代码的样子:

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

char* reverseString(char*);

int main(void)
{
    pid_t id;
    int fd[2], nbytes;
    char string[80];
    char readbuffer[80];
    char* reversed;
    pipe(fd);

    if((id = fork()) == -1)
    {
        perror("fork");
        exit(1);
    }
    if(id != 0)
    {
        close(fd[0]);
        printf("PARENT\n--------------------\n");
        // printf("fork: %d\n", id);
        printf("my pid is %d\n", getpid());
        // printf("my parent's pid is %d\n", getppid());
        printf("enter string: ");
        scanf("%s", string);
        write(fd[1], string, (strlen(string)+1));

    }
    else
    {
        close(fd[1]);
        printf("CHILD\n--------------------\n");
        // printf("fork: %d\n", id);
        printf("my pid is %d\n", getpid());
        // printf("my parent's pid is %d\n", getppid());
        nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
        printf("Received string: %s\n", readbuffer);
        reversed = reverseString(readbuffer);
        printf("Reversed string: %s\n", reversed);

        pid_t id2;
        int fd2[2];
        char readbuffer2[80];

        pipe(fd2);

        if((id2 = fork()) != 0)
        {
            close(fd2[0]);
            printf("My pid: %d\n", getpid());
            write(fd2[1], reversed, (strlen(reversed)+1));
        }
        else
        {
            close(fd2[1]);
            printf("My Child's PID: %d\n", getpid());
            nbytes = read(fd2[0], readbuffer2, sizeof(readbuffer2));
            printf("Received string2: %s\n", readbuffer2);
        }

    }
    return (0);
}

char* reverseString(char* str)
{
    char reversed[80];
    int n = strlen(str);
    for(int i = n - 1, j = 0; i >= 0; i--, j++)
        reversed[j] = str[i];
    reversed[n] = '\0';
    return reversed;
}

我正在尝试将反向字符串通过管道传输到在第二个进程中分叉的第三个进程中,但它没有显示出来。

另外,当我在输入后执行scanf 时,会继续打印,直到打印出子部分,然后我输入字符串。我如何防止它打印所有内容。它看起来像这样:

PARENT
--------------------
my pid is 821
enter string: CHILD
--------------------
my pid is 822
$

【问题讨论】:

  • 在child中,将printfs放在read之后,这样child在打印任何东西之前等待输入。
  • 感谢@user3386109 修复它!
  • 代码中有几个问题。 1) 你的编译器应该告诉你返回一个指向reversestring()函数堆栈中的char数组的指针的问题(如此有效,char数组超出范围/函数退出时不再存在) 2) 对fork() 的第二次调用假定调用成功。假设对系统函数的调用是成功的,这绝不是一个好主意。
  • 这一行:scanf("%s", string); 不限制用户可以输入的字符数,因此用户可能会超出输入缓冲区string,从而导致未定义的行为,并可能导致段错误事件。同样在reverseString() 函数中,假设(不是安全的假设)传入的字符串少于 80 个字符。建议:scanf("%79s", string);其中 79 允许 scanf() 将 NUL 字节附加到通过 '%s' 格式说明符输入的字符。

标签: c unix system


【解决方案1】:

reverseString 函数中,您返回的数组地址是一个自动局部变量。当函数返回时,这些变量会被销毁。

char* reverseString(char* str)
{
    char reversed[80];
    // local array, cannot use it after the function returns

要么使用malloc() 分配将在函数调用之间保留的内存,要么就地反转字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    • 2021-12-16
    • 2011-12-22
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多