gpt4 book ai didi

c - 将 select() 与管道一起使用

转载 作者:行者123 更新时间:2023-12-04 02:43:29 24 4
gpt4 key购买 nike

这个想法是创建一个二叉进程树,将信息向下发送到树,然后将值发送回树,在信息上升时聚合信息。

我遇到的问题是使用 select()以确定何时准备好读取管道。在我到目前为止所写的内容中,第一个管道(第一个左 child )能够接收信息并打印它;然而,第二个管道(第一个右 child )在收到任何信息之前就超时了。我不知道为什么,因为第一个管道工作得很好。

每个 child 最终都会创建自己的 child ,如果没有更好的处理 select(),我什至无法开始这个过程的部分。 .

int bit_count(char *passed, int len){
//initialize file descriptors
int fd1[2] = {1, 2};
int fd2[2] = {3, 4};

fd_set read_set;
fd_set write_set;

//set timeval structure for timeout
struct timeval tv;
tv.tv_sec = 10;
tv.tv_usec = 0;

FD_ZERO(&read_set); //clear the set
FD_SET(fd1[0], &read_set); //add first file descriptor to set
FD_SET(fd2[0], &read_set); //add second file descriptor to set

//open the pipes
pipe(fd1);
pipe(fd2);

//fork a child process
pid_t kid = fork();
if(kid == -1) printf("forking failed.");

if (kid == 0){ //first child process
int status = 1;
while(status){
int retval = select(fd1[0]+1, &read_set, NULL, NULL, &tv);

switch(retval) {
case -1:
printf("Select Error.\n");
exit (-1);
status = 0;
break;

case 0:
printf("Timeout...");
status = 0;
break;

default:
if (FD_ISSET(fd1[0], &read_set)) {
char *lstring = malloc(sizeof(char)*(len/2));
read(fd1[0], lstring, len);
printf("Child Left: %s\n", lstring);
close(fd1);
//execl("child.c", parent);
status = 0;
}
}
}
}

else{ //parent process
//fork a second child process
pid_t kid2 = fork();

if (kid2 == 0) { //second child process
int status = 1;
while(status){
int retval = select(fd2[0]+1, &read_set, NULL, NULL, &tv);

switch(retval) {
case -1:
printf("Select Error.\n");
exit (-1);
status = 0;
break;

case 0:
printf("Timeout...");
status = 0;
break;

default:
if (FD_ISSET(fd2[0], &read_set)) {
char *rstring = malloc(sizeof(char)*((len/2)+(len%2)));
read(fd2[0], rstring, len);
printf("Child Right: %s\n", rstring);
//execl("child.c", parent);
status = 0;
}
}
}
}

else{
int status;
//create character arrays for
printf("\n\nParent Original String: %s\n", passed);
printf("Measured Length: %d\n", len);
int left = (len/2);
int right =(len/2)+(len % 2);
char *lstring = malloc(sizeof(char)*(left+1));
char *rstring = malloc(sizeof(char)*(right+1));
memcpy(lstring, passed, left);
lstring[left] = '\0';
memcpy(rstring, passed+left, right);
rstring[right] = '\0';
printf("Parent Left: %s\n", lstring);
printf("Parent Right: %s\n", rstring);
write(fd1[1], lstring, sizeof(char)*(left+1));
write(fd2[1], rstring, sizeof(char)*(right+1));
waitpid(kid, &status, NULL);
waitpid(kid2, &status, NULL);
}
return 0;
}
return 0;
}

最佳答案

如果您阅读了 reference page ,你会看到

Upon successful completion, the pselect() or select() function shall modify the objects pointed to by the readfds, writefds, and errorfds arguments



因此,在调用 select 之前,您必须在循环中的每次迭代中设置描述符集。 .

另请注意,超时结构也可能会被修改。

您还应该使用最大的描述符(加一个)作为第一个参数。如 fd2[0]大于 fd1[0]那么调用将不会按预期工作。

关于c - 将 select() 与管道一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19373741/

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