首页 > 解决方案 > 停止子进程重复输出而不杀死

问题描述

我有一个父进程,它接收可以创建子进程的用户输入,然后通过进一步的输入来操作单个子进程。

应该打印的内容如下:

New Locker Created: 1

New Locker Created: 2

New Locker Created: 3

New Locker Created: 4

New Locker Created: 5

但相反,我收到以下内容:

New Locker Created: 1

New Locker Created: 2

New Locker Created: 3

New Locker Created: 4

New Locker Created: 5

New Locker Created: 5

New Locker Created: 4

New Locker Created: 5

New Locker Created: 5

New Locker Created: 3

New Locker Created: 4

New Locker Created: 5

这会持续几行,但这就是想法。据我了解,这是因为子进程继续执行,因为父进程在接收新输入时一直在等待其他子进程完成。这个对吗?

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
#include "locker.h"
#include <signal.h>
#include <stdarg.h>

#define P1_READ 0
#define P2_WRITE 1
#define P2_READ 2
#define P1_WRITE 3

#define NUM_PIPES 2

pid_t this_pid;

int main(){

char buffer[100];

int locker_count = 0;
int fd[2*NUM_PIPES];
int len = 0, i;
pid_t pid_list[100], wpid;

memset(pid_list,0,100);

pid_t this_pid;
struct locker_t new_locker = { .id = 0, .user_id = 0, .locked = 1, .owned = 0};

fflush(stdout);

while(1){
    scanf("%s", buffer);

    fflush(stdout);

    if(strcmp(buffer, "CREATE") == 0){

        for(i = 0; i < NUM_PIPES; ++i){
            if(pipe(fd+(i*2)) < 0){
              perror("Failed to allocate pipes");
              exit(EXIT_FAILURE);
            }
        }

        fflush(stdout);

        this_pid = fork();

        if(this_pid == 0){

            //close descriptors we don't need in this process
            close(fd[P1_READ]);
            close(fd[P1_WRITE]);

            len = read(fd[P2_READ], &locker_count, sizeof(locker_count));

            //increase by 1
            locker_count++;

            //create locker
            new_locker.id = locker_count;

            printf("New Locker Created: %d\n", locker_count);
            printf("\n");

            write(fd[P2_WRITE], &locker_count, sizeof(locker_count));

            //finished. close remaning descriptors
            close(fd[P2_READ]);
            close(fd[P2_WRITE]);

            //need to stop this process for further executing

        }
        if(this_pid > 0){

            //close unneeded descriptors
            close(fd[P2_READ]);
            close(fd[P2_WRITE]);

            write(fd[P1_WRITE], &locker_count, sizeof(locker_count));

            //now wait for response
            len = read(fd[P1_READ], &locker_count, sizeof(locker_count));

            //pid_list[(locker_count-1)] = this_pid;

            close(fd[P1_READ]);
            close(fd[P1_WRITE]);            

            fflush(stdout);

            while ((wpid = waitpid(this_pid, NULL, 0)) > 0); 

        }
    }

    if(strcmp(buffer, "QUIT") == 0){
        break;
        exit(0);
    }
}
}

谢谢你的帮助 :)

标签: cmultiprocessingparent-childinterprocess

解决方案


推荐阅读