c - 父级不从管道读取

标签 c pipe

我想与父进程进行子进程通信。我创建了 5 个 child ,每个人都向管道发送消息“Hello”。但家长只读了一条消息..我很初学者,我不知道我做错了什么...到目前为止我的代码:

int main(int argc, char** argv) {
    int n, p1[2], p2[2];
    n = 2*atoi(argv[1]);
    if(pipe(p1)) ERR("pipe1");
    if(pipe(p2)) ERR("pipe2");
    create_children(n, p1, p2);
        if(TEMP_FAILURE_RETRY(close(p1[1]))) ERR("close");
    parent_work(p1);
    if(TEMP_FAILURE_RETRY(close(p1[0]))) ERR("close");
    return EXIT_SUCCESS;
}

void create_children(int number, int p1[2], int p2[2]) {
    while (number-- > 0) {
        switch (fork()) {
            case 0:
                if(TEMP_FAILURE_RETRY(close(p1[0]))) ERR("close");
                if(TEMP_FAILURE_RETRY(close(p2[0]))) ERR("close");
                child_work(p1[1], p2[1]);
                if(TEMP_FAILURE_RETRY(close(p1[1]))) ERR("close");
                if(TEMP_FAILURE_RETRY(close(p2[1]))) ERR("close");
                exit(EXIT_SUCCESS);

            case -1: ERR("Fork:");
        }
    }
}

void child_work(int fd, int fd1, char *name, int which) {
    char buffer[PIPE_BUF];
    size_t *len = (size_t*)buffer;

    char mb[PIPE_BUF];
    snprintf(mb,PIPE_BUF,"%d hello\n",getpid());
    if (-1 == TEMP_FAILURE_RETRY (write (fd, mb, (strlen(mb)+1))))  /
            ERR ("sending witaj");
            else
            printf("%s\n",mb);  
}

void parent_work(int fd) {
    char buffer[PIPE_BUF];
    if(TEMP_FAILURE_RETRY(read(fd, buffer, PIPE_BUF))==PIPE_BUF)ERR("read:");   
    printf("Process send message: %s\n", buffer);

    while(TEMP_FAILURE_RETRY(wait(NULL))>0);
}

当我创建 5 个子级时,我只收到 1 条消息。

最佳答案

这行不通:

char mb[]=" ";
snprintf(mb,PIPE_BUF,"%d",getpid());
strcat(mb,"hello");

您写入的内容超过了 mb 的末尾,它只有两个字符的空间,因为它是用空格后跟 NUL 字节进行初始化的。在 C 中,当您写入超过数组末尾时,数组不会像使用 snprintfstrcat 那样神奇地增长。

从技术上讲,您调用了所谓的未定义行为,这意味着任何事情都可能发生。

关于c - 父级不从管道读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22500605/

相关文章:

python - 使用子进程在Python中逐行写入/读取管道

if-statement - 当我通过管道传送到 IF 命令时会发生什么?

shell,将参数列表一个一个地传递给命令

如果参数包含等号,CGI 脚本不会接收参数

c - C如何调用不带参数的函数?

c - 如何将 void* 转换为 int[][3]

c - realloc - 将 int 转换为 char

C++ 管道和 fork

angular - 日期管道错误-升级到 Angular 11 时无法读取未定义的属性 'toLowerCase'

objective-c - 有没有办法检查进程是 64 位还是 32 位?