Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.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_Pipe_Fork_Ipc - Fatal编程技术网

C-在进程之间来回发送数据

C-在进程之间来回发送数据,c,pipe,fork,ipc,C,Pipe,Fork,Ipc,我正在做下面的程序。它应该做的是从子进程获取随机int,并根据item_count变量,通过使用管道将适当的消息返回给子进程。问题是我在执行时遇到了很多意想不到的行为,请参见下文。myCatalog是一个结构 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <time.h> #include <sys/wait.h> #include <str

我正在做下面的程序。它应该做的是从子进程获取随机int,并根据item_count变量,通过使用管道将适当的消息返回给子进程。问题是我在执行时遇到了很多意想不到的行为,请参见下文。myCatalog是一个结构

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

struct catalog {
    char description[128];
    int price;
    int item_count;
};

int main() {
    int i, j, k, fd1[5][2], fd2[5][2];
    struct catalog myCatalog[3];
    pid_t pid;
    int itemNo;
    char message[24];
    char messageFailure[] = "Failure.", messageSuccess[] = "Success!";;        

 

    for(i = 0; i < 5; i++) {
        if(pipe(fd1[i]) == -1) {
                printf("Error opening pipe 1!\n");
                exit(1);
        }

        if(pipe(fd2[i]) == -1) {
            printf("Error opening pipe 2!\n");
            exit(1);
        }

        pid = fork();

        if(pid == 0) { //Child
            time_t t;
            srand((int)time(&t) % getpid());
            
            close(fd1[i][0]);  //Close reading end of fd1
            close(fd2[i][1]);  //Close writing end of fd2
            
            for(k = 0; k < 10; k++) {
                itemNo = rand() % 21;
                write(fd1[i][1], &itemNo, sizeof(int));
                sleep(1);
                read(fd2[i][0], message, sizeof(message));
                printf("%s\n", message);
            }
            printf("Hello from child process %d\n", getpid());
            close(fd1[i][1]);
            close(fd2[i][0]);
            exit(0);
        }
        else if(pid > 0) { //Parent
            int item;

            close(fd1[i][1]);  //Close writing end of fd1
            close(fd2[i][0]);  //Close reading end of fd2

            if(i == 0) {
                for(j = 0; j < 20; j++) {
                    snprintf(myCatalog[j].description, sizeof(myCatalog[j].description), "Item #%d", j);
                    myCatalog[j].price = (rand() % 10) + 1;
                    myCatalog[j].item_count = 2;
                }
                for(j = 0; j < 20; j++) {
                    printf("Description: %s\n", myCatalog[j].description);
                    printf("Price: %d\n", myCatalog[j].price);
                    printf("Count: %d\n", myCatalog[j].item_count);
                }   
            }
            for(j = 0; j < 10; j++) {
                read(fd1[i][0], &item, sizeof(int));
                printf("%d\n", item);
                myCatalog[item].item_count = myCatalog[item].item_count - 1;
                if(myCatalog[item].item_count <= 0) {
                    write(fd2[i][1], messageFailure, sizeof(messageFailure));
                }
                else {
                    write(fd2[i][1], messageSuccess, sizeof(messageSuccess));                
                }
                sleep(1);
            }
            printf("Hello from parent process %d\n", getpid());
            close(fd1[i][0]);
            close(fd2[i][1]);
            wait(NULL);
        }
        else {
            printf("Error forking!");
            exit(1);
        }

    }
    return 0;
}
它应该做的是打印数字,然后是成功或失败等。此外,它有时会打印出13个数字,而不是10个。问题是,问题出在哪里?是我的管道吗?我的循环使用完全错误吗?
任何帮助都将不胜感激。

这看起来肯定不对。访问n>2的
myCatalog[n]
将调用未定义的行为

  struct catalog myCatalog[3];
  ...
  for(j = 0; j < 20; j++) {
          printf("Description: %s\n", myCatalog[j].description);
struct catalog myCatalog[3];
...
对于(j=0;j<20;j++){
printf(“说明:%s\n”,myCatalog[j].说明);

printf(“错误…”
不正确。请尝试
fprintf(stderr,“错误…””);
。错误属于stderr。我看不到“成功”在你的代码中的任何地方。展示一个完整的例子。包括一个
main
函数和所有#includes。如果我能剪切粘贴你的代码,我愿意使用它。我不愿意在它当前不完整的状态下使用它。@williampersell这不是一个要求。这不像计算机猜测你正在打印的东西是否正确是一条错误消息,如果是的话,除非你使用stderr,否则不会打印它。很抱歉这么晚才给你回复,我已经更新了代码片段,包含了完整的程序!@user253751确实,计算机无法猜测该消息是错误消息并拒绝将其打印到stdout。这并没有改变它是错误消息的事实将错误消息打印到stdout是不正确的。如果有什么问题的话,那么程序做正确的事情就更重要了。错误消息属于stderr。哦,天哪,我在测试较小的尺寸,我一定忘了更改它。非常感谢你发现了它,因为我知道我永远不会看到它!不过我确实有一个跟进。所有这些g现在打印很好,除了有时,它会为一个没有被调用过2次的项目打印失败。我对该部分的处理方法是否错误?似乎我在扣除项目计数时出错了。再次非常感谢您,如果我对第二个问题太贪心了,我很抱歉!@sntovas我建议检查
read
返回的值以做出正确的判断当然,您确实得到了一个值。看起来item_price字段实际上并没有递减,它实际上假设了一个随机值,我想知道为什么?
  struct catalog myCatalog[3];
  ...
  for(j = 0; j < 20; j++) {
          printf("Description: %s\n", myCatalog[j].description);