gpt4 book ai didi

c - 是否可以多次调用 waitpid ? [UNIX] [C]

转载 作者:行者123 更新时间:2023-11-30 14:43:18 24 4
gpt4 key购买 nike

我的老师布置了一项工作,其中包括制作一个伪调度程序。我现在陷入了最重要的部分。给我带来麻烦的行是最后的 waitpid 行。基本上我希望父进程等待他的所有 child ,这就是我这样做的原因。但代码此时就卡住了。当我评论它时,它运行到最后,但没有任何内容写入 STDOUT。

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

#define LOOP_SIZE 20;

/* SIG HANDLERS DEFINITION */
void parentsighandler(int);

/* GLOBAL VARIABLE DEFINITION */
pid_t n, ppid;
int nb_args, compteur;

// array of pid_t to send signals to child
pid_t *child_pids;


int main(int argc, char *argv[]){
if (argc - 1 >= 1 ){
// Variable initialisation
compteur = 0;
nb_args = argc - 1;
child_pids = malloc((argc - 1) * sizeof(pid_t));

// String for sprintf
char sstr[40];
char rstr[40];


// Initializing all the pipes for the processes
int p[2 * (argc - 1)];

// getting the pid of the parent process
ppid = getpid();

//Initializing all pipes
int i, j, status, stop_val;
for (i = 0; i < argc - 1; i++){
if (pipe(&p[2*i]) == -1){
perror("pipe failed");
_exit(EXIT_FAILURE);
}
}

for (i = 0; i < argc - 1; i ++){
switch( n = fork()){
case -1:
perror("fork failed");
_exit(EXIT_FAILURE);
case 0:
/* CHILD */
if (0 == (stop_val = atoi(argv[i+1]))){
perror("atoi failed");
_exit(EXIT_FAILURE);
}
close(p[i*2]);
for (j = 0; j < 20 ; j++){
write(STDOUT_FILENO, "here\n", 5);
if (j % stop_val == 0){
kill(ppid, SIGUSR1);
}
sprintf(sstr, "Je suis le proc %d : message %d\n", getpid(), i);
write(p[i * 2 + 1], sstr, 40);
}
close(p[i*2+1]);
_exit(EXIT_SUCCESS);

default:
/* PARENT - process scheduling */
child_pids[i] = n;
kill(n, SIGSTOP);
}
}
write(STDOUT_FILENO, "Debut de l'ordonnancement\n",26);

// Setting up the signal
signal(SIGUSR1, parentsighandler);

write(STDOUT_FILENO, "before wait\n",12);
// The parent as to wait for all child to finish
for (i = 0; i < argc - 1; i ++){
// write(STDOUT_FILENO, "beit\n",12);
printf("value of pid n%d is %d\n", i, child_pids[i]);
// waitpid(child_pids[i], &status, 0);
// close(p[i * 2 + 1]); // closing the write end of the pipe
}

write(STDOUT_FILENO, "cefore main\n",12);
char mystr[15];
sprintf(mystr, "compteur : %d\n", compteur);
write(STDOUT_FILENO, mystr, 15);
while(1){
write(STDOUT_FILENO, "refore main\n",12);
kill(child_pids[compteur], SIGCONT);
write(STDOUT_FILENO, "jefore main\n",12);
while(read(p[2 * compteur], rstr, 40) > 0){
write(STDOUT_FILENO, rstr, 40);
}
}
} else {
perror("Not enough args\n");
_exit(EXIT_FAILURE);
}
return 0;
}

void parentsighandler(int sig){
if (sig == SIGUSR1){
write(STDOUT_FILENO, "passe dans sig handler\n", 23);
kill(child_pids[compteur], SIGSTOP);
if (compteur == nb_args){
compteur = 0;
} else {
compteur ++;
}
}
}

最佳答案

为什么家长(似乎)在指令处停下来:

waitpid(child_pids[i], &status, 0);

因为在父进程设置信号处理程序之前,子进程正在杀死父进程

关于c - 是否可以多次调用 waitpid ? [UNIX] [C],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53997676/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com