Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 正在退出子进程_C_Linux - Fatal编程技术网

C 正在退出子进程

C 正在退出子进程,c,linux,C,Linux,我有以下代码。它由一个父进程和两个子进程(生产者和消费者)组成。生产者接受用户输入,并将其传递给消费者,消费者汇总已出现的元音总数。父进程只侦听两个子进程,如果它们因任何原因停止,则重新启动它们。生产者进程在用户输入“p”时退出,消费者进程在接收到包含“y”的字符串时停止 我遇到的问题是生产者进程中的\u exit()函数调用没有导致进程终止。使用者进程中的\u exit()函数调用按预期工作。为什么使用者进程正确终止,而生产者函数没有正确终止 #include <stdlib.h>

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

我遇到的问题是生产者进程中的
\u exit()
函数调用没有导致进程终止。使用者进程中的
\u 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;
}
#包括
#包括
#包括
#包括
#包括
int main(){
pid_t c_p,c_c;
int p[2];
管道(p);
c_p=fork();
如果(c_p>0)c_c=fork();
对于(;;){
//生产过程
如果(c_p==0){
charc[20];
printf(“%s”,“输入字符串:\n”);
fgets(c,20,stdin);
如果(c[0]='p'&&strlen(c)==2)\u退出(1);
接近(p[0]);
写(p[1],c,(strlen(c)+1));
}
//消费过程
else如果(c_c==0){
int j;
静态int a=0,e=0,i=0,o=0,u=0;
字符缓冲区[20];
关闭(p[1]);
读取(p[0],缓冲区,sizeof(缓冲区));
对于(j=0;j0){
c_c=fork();
}
/*结果=等待PID(c_p和状态,WNOHANG);
如果(结果>0){
c_p=fork();
}*/
}
}
返回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_p=fork();
c_c=fork()

您可以将其更改为:

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

杰出的差不多了。进程现在正确终止,但会不断请求用户输入。有没有办法让程序停止调用printf()?我假设它会在进程被终止后停止……好吧,问题是,waitpid将返回状态已更改的子进程的进程ID的pid。似乎无论消费者遇到什么输入,你总是会提出一个新的消费者流程。如果要使用输入“y/y”终止使用者,请将If(结果>0)更改为If(状态==0)极好。差不多了。进程现在正确终止,但会不断请求用户输入。有没有办法让程序停止调用printf()?我假设它会在进程被终止后停止……好吧,问题是,waitpid将返回状态已更改的子进程的进程ID的pid。似乎无论消费者遇到什么输入,你总是会提出一个新的消费者流程。如果要使用输入“y/y”终止使用者,请将If(结果>0)更改为If(状态==0)