c - 退出子进程

标签 c linux

我有以下代码。它由一个父进程和两个子进程(一个生产者和一个消费者)组成。生产者接受用户输入并将其传递给消费者,消费者汇总已出现的元音总数。父进程只监听两个子进程并在它们因任何原因停止时重新启动它们。生产者进程在用户输入“p”时退出,消费者进程在收到包含“y”的字符串时停止。

我遇到的问题是生产者进程中的 _exit() 函数调用没有导致进程终止。消费者进程中的 _exit() 函数调用按预期工作。为什么消费者进程正确终止而生产者函数却没有?

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

int main(){
    pid_t c_p, c_c;
    int p[2];
    pipe(p);
    c_p = fork(); 
    if(c_p > 0) c_c = fork();

    for(;;){
        // Producer Process
        if(c_p == 0){
            char c[20];
            printf("%s", "Enter a string: \n");
            fgets(c, 20, stdin);
            if(c[0] == 'p' && strlen(c) == 2) _exit(1);
            close(p[0]);
            write(p[1], c, (strlen(c) + 1));
        }

        // Consumer Process
        else if(c_c == 0){
            int j;
            static int a = 0, e = 0, i = 0, o = 0, u = 0;
            char buffer[20];
            close(p[1]);
            read(p[0], buffer, sizeof(buffer));

            for(j = 0; j < strlen(buffer); j++){
                if     (buffer[j] == 'a' || buffer[j] == 'A') a++;
                else if(buffer[j] == 'e' || buffer[j] == 'E') e++;
                else if(buffer[j] == 'i' || buffer[j] == 'I') i++;
                else if(buffer[j] == 'o' || buffer[j] == 'O') o++;
                else if(buffer[j] == 'u' || buffer[j] == 'U') u++;
                else if(buffer[j] == 'y' || buffer[j] == 'Y') _exit(1);
            }

            printf("Sum of Vowels... \tA: %d \tE: %d \tI: %d \tO: %d \tU: %d\n", a, e, i, o, u);
        }

        // Main Process
        else{
            int status;
            pid_t result = waitpid(c_c, &status, WNOHANG);
            if(result > 0){
                c_c = fork();
            }

            /*result = waitpid(c_p, &status, WNOHANG);
            if(result > 0){
                c_p = fork();
            }*/
        }
    }

    return 0;
}

最佳答案

之后你的程序中存在四个进程

c_p = fork(); c_c = fork();

你可以改成这样:

c_p = fork(); 
if (c_p > 0)
{
    c_c = fork();
    // Do something.
} else if (c_p == 0)
{
    // Do something.
}

关于c - 退出子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34147687/

相关文章:

c++ - 是否存在 LibC 操作系统?

c - 临时数据存放在哪里(嵌入式C)

c - 初始化一个 in_addr_t 而不进行文本解析

linux - 在 linux 中删除 *.txt 文件之前如何计数并添加到文件?

linux - 本地 IPC 的 POSIX 消息队列或 unix 域套接字

c - 避免/减轻每次函数调用后返回值检查的痛苦的方法?

python - 核心转储 : Extract all the global variables , 核心转储中的数据结构和子结构

python - python的fcntl.ioctl中的 'op'是什么意思?

python - Enthought Canopy 不适用于 Fedora。给出与未找到 Zlib 相关的错误

c++ - std::thread 无法在 linux eclipse 上工作