webBG - програмисти, машинно обучение, javascript, python, php, питам, говорим, публикации

Заявка за създаване на канал между два дескриптора на процес родител-дете

В моята работна програма по-долу бих искал да разбера,

Как/кой е установил (създал) еднотръбна комуникация между дескриптора {child's pair[1]} и дескриптора {parent's pair[0]}?

Тъй като в моята програма по-долу, аз просто fork()'d процес и веднага кой е установил тръбна връзка между дескриптора {child's pair[1]} и дескриптора {parent's pair[0]}? Смятате ли, че е очевидно да приемете тази точка?

   #include <stdio.h>
   #include <stdlib.h>
   #include <errno.h>
   #include <sys/types.h>
   #include <unistd.h>
   int main(void)
   {
   int pair[2];
   char buf[30] ="";
   pipe(pair);
   if (!fork()) {
          printf(" CHILD: writing to the pipe\n");
          write(pair[1], "test", 5);
          printf(" CHILD: exiting\n");
          exit(0);
   } else {
          printf("PARENT: reading from pipe\n");
          read(pair[0], buf, 5);
          wait(NULL);
          printf(" PARENT: exiting\n");
   }
   return 0;
   }

Моля, помогни ми!!

24.02.2014

Отговори:


1

Въпросите ви не са особено ясни; вторият "въпрос" казва, че нещо изглежда очевидно, но изглежда, че не съдържа сам въпрос. Например, вие всъщност не казвате какво се обърка в мострите, които сте представили (ако има такива).

Мисля, че това, което трябва да знаете, може да е следното:

  1. pipe() създава два файлови дескриптора, които са свързани в рамките на операционната система, четец и записващ.

  2. Когато fork() всички отворени FD са налични както в родителския, така и в дъщерния. Така че, ако сте извикали pipe() преди fork(), и четецът, и записващият ще бъдат достъпни за детето.

  3. Тъй като обикновено родителят ще бъде четец, а детето писател, или родителят ще бъде писател, а детето четец (т.е. нито едно от двете няма едновременно да пише и чете), нормално е родителят да затворете единия фд и детето да затвори другия.

24.02.2014
  • Друг момент е, че изглежда с помощта на pipe() api в програмата по-долу, установяването на тръбна комуникация между pair[1](като писател) и pair[0](като четец), изглежда очевидно за мен. #include ‹stdio.h› #include ‹stdlib.h› #include ‹errno.h› #include ‹sys/types.h› #include ‹unistd.h› int main(void) { int pair[2]; char buf [30] =; тръба (чифт); запис (двойка [1], тест, 5); четене (двойка [0], buf, 5); printf(%s,buf); връщане 0; } 24.02.2014
  • abligh: позволете ми да поставя въпроса, който зададох по-горе. Как/кой е установил (създал) еднотръбна комуникация между дескриптора {child's pair[1]} и дескриптора {parent's pair[0]}? Тъй като в моята програма по-долу, аз просто fork()'d процес и веднага кой е установил тръбна връзка между дескриптора {child's pair[1]} и дескриптора {parent's pair[0]}? Смятате ли, че е очевидно да приемете тази точка? 24.02.2014
  • Повикването pipe установи тази комуникация между дескриптора pair[1] на родителя и дескриптора pair[0] на родителя. След това fork() създава дете и неговият pair[1] дескриптор (и за този въпрос pair[0] дескриптор, но това не е от значение) се споделя с неговия родител. Следователно pair[1] на детето е свързано с pair[0] на родителя чрез тръбата. Не съм сигурен какво имате предвид под „мислите ли, че е очевидно“. Очевидно е за някой, който се занимава с програмиране на C socket от 20 години, но може би не и за новодошъл; няма срам нещата да не са очевидни. 24.02.2014
  • Моля, потвърдете, ако разбирам правилно, ако стартирам pipe(pfds), в програма, в която не създаваме дъщерен процес, мисля, че pipe() api създава и отваря временен файл на диска и използва open() api за връщане запис на файлов дескриптор за ниво на достъп в pfds[1] и четене на файлов дескриптор за ниво на достъп в pfds[0]. СЕГА, ако стартирам fork() в програмата, тези два дескриптора се дублират в дъщерен процес и сочат към същия този временен файл, съхранен на твърдия диск. така че от гледна точка на временния файл имаме два дескриптора за запис и два дескриптора за четене. правилно? 25.02.2014
  • Под Linux (и всяка версия на Unix, за която знам) създаването на канал НЕ създава временен файл. Създава тръба. 25.02.2014
  • Нови материали

    Записване на грешки — Как да записвате грешки във вашето приложение, за да ги отстраните по-късно
    Записването на грешки е важна част от „обработването на грешки“. Накратко, когато възникнат определени грешки в програмите, вие искате да знаете за това. Това е особено важно при грешки. Ти..

    Кратко въведение в теорията на графите
    Кратко въведение в теорията на графите Втора част: внедряване на python на пълни графики В моята предишна статия въведох три основни концепции за графите: върхове, ръбове и тегла. В тази..

    Днес ще пиша за машинно обучение. Смятам се за ентусиаст, а не за експерт, така че имайте това предвид. С това казано, искам...
    Днес ще пиша за машинно обучение. Смятам се за ентусиаст, а не за експерт, така че имайте това предвид. С това казано искам да обясня защо машинното обучение има значение. За да бъда съвсем..

    Какво е структурно типизиране и как Typescript го използва в своя полза?
    Всички знаят тези дни, че „Typescript е строго синтактично надмножество на JavaScript и добавя незадължително статично въвеждане към езика.“. Но какво всъщност означава? Защо миграцията от..

    3 начина за премахване на дубликати от масив в Javascript
    Вие сте уеб разработчик? Програмист ли си? Тогава ще сте запознати с JavaScript и различните му вградени функции, методи и т.н. за различни реализации, проблеми и цели. Един от тези широко..

    Архитектура и обучение на конволюционни невронни мрежи (7 точки):
    Тази публикация предоставя подробности за архитектурата на Конволюционната невронна мрежа (CNN), функциите и обучението на всеки слой, завършвайки с резюме на обучението на CNN...

    Създайте разширение за Chrome с помощта на Angular
    Този урок е базиран на манифеста на разширението на chrome версия 3 (MV3), а също и на Angular версия 2+ (2, 3 и...). Ако не сте използвали манифест версия 3, можете да следвате този урок ,..