دفق إخراج execvp عبر المقبس
سؤال
أعلم أن هذا السؤال قد تم طرحه مليار مرة، لكن كل الحلول لا تناسبني.أحتاج إلى دفق 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
في كل سطر من الكود يمكنني العثور على المشكلة.
بصراحة، أشعر بالغباء.