سؤال

أعلم أن هذا السؤال قد تم طرحه مليار مرة، لكن كل الحلول لا تناسبني.أحتاج إلى دفق stdout من execvp عبر مأخذ توصيل للعميل.رمز العميل ذو الصلة هو هذا

static void execute_cmd(int fd, char *cmd, char **params) {
    pid_t cid;
    size_t i = 0, c = 0;

    cid = fork();

    if(cid == 0) {
        close(STDOUT_FILENO);
        dup2(fd, STDOUT_FILENO);

        if(execvp(cmd, params) < 0) {
            fprintf(stderr, "Could not execute \"%s\": %d\n", cmd, errno);
            exit(1);
        }
    } else {
        close(fd);
        waitpid(cid, NULL, 0);
        exit(1);
    }
}

لقد حاولت نسخ الجواب على هذا السؤال.ومع ذلك، لا أحصل على أي شيء مرة أخرى عندما أحاول هذا الرمز:

int sockfd = serverConnect();
write(sockfd, "echo math", 11);
n = read(sockfd, buffer, 1023);

printf("Got %d bytes\n", n);
printf("%s\n", buffer);

close(sockfd);

لقد قمت بالتحقق ثلاث مرات من أن الاتصال قد تم بشكل صحيح.عندما أستبدل execute_cmd مع بسيطة write, ، يقوم العميل بطباعة الإجابة بشكل صحيح.ولكن لا شيء يحدث عندما أقوم بتنفيذ التعليمات البرمجية أعلاه، ولا أستعيد أي بايت.لقد قمت بإزالة dup2 اتصل ولم يحصل على أي إخراج من execvp اتصل سواء.

لقد شعرت باليأس الشديد هنا، لقد حاولت pipe وكل ما يمكن أن أجده.اين أخطأت؟الأمر نفسه جيد أيضًا، ويعمل على الصدفة، و execvp المكالمة لا ترمي خطأ.

هل كانت مفيدة؟

المحلول

تبين أن الكود أعلاه صحيح.وكانت المشكلة استخدام غير صحيح لسابق strtok مما أدى إلى تحطم صامت لـ strdup.ال fork لم يتم تنفيذ ما ورد أعلاه مطلقًا، وكانت جميع اختباراتي أعلى من strtok خط.إلا بعد وضع printfفي كل سطر من الكود يمكنني العثور على المشكلة.

بصراحة، أشعر بالغباء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top