Создание труб с массивом в цикле - PullRequest
0 голосов
/ 06 октября 2018

Мне нужно создать 10 каналов в C. Чтобы заставить их работать, мне нужно создать 10 массивов int размером 2?Или я могу просто объявить массив размером 20, а затем указать канал, с которого должна начинаться каждая труба?Если мне нужно создать 10, есть ли способ, которым я могу создать их в цикле и получить вид этого результата?

for(i=0; i<10; i++){
    vec0[2];    //create array vec0, vec1, vec2....
    pipe(vec0);
}

Является ли даже массив лучшим способом сделать это?

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Мне нужно создать 10 каналов в C. Чтобы заставить их работать, мне нужно создать 10 массивов int размером 2?

Это будет одна альтернатива, но нетолько один.

Или я могу просто объявить массив размером 20, а затем дать каналу адрес, где должна начинаться каждая труба?

Да, вы могли бы сделать это.Функция pipe() в любом случае получает только указатель на первый int и требует, чтобы один последующий адрес был адресован через этот указатель.

Если мне нужно создать 10, есть лиКак я могу создать их в цикле и получить вид этого результата?

Да, вы можете объявить массив из двух - int в цикле, передать его в pipe() и скопироватьрезультат до некоторого более постоянного хранения до следующей итерации, но это было бы расточительно.

Первое, что нужно рассмотреть, - это то, как вы хотите хранить дескрипторы файлов на конце канала.Если они вам нужны только на время цикла, то вы можете просто продолжать использовать один и тот же массив или использовать массив для каждой петли-итерации, чтобы он был только один.

Но предположим, что вы хотите толькосоздайте каналы в цикле, так что вам нужно отслеживать все их файловые дескрипторы после окончания цикла.В таком случае наиболее естественной структурой данных для хранения только файловых дескрипторов будет массив массивов, или 2D-массив:

int pipefds[10][2];

Если вы планируете использовать такую ​​структуру, то ваш циклможет выглядеть так:

int pipefds[10][2];

for (int i = 0; i < 10; i++) {
    pipe(pipefds[i]);
}
0 голосов
/ 06 октября 2018

Вы можете просто использовать двумерный массив int, как показано ниже.

int fds[10][2];
for(i=0; i<10; i++){
   pipe(fds[i]);
}

Где fds[i][0] представляет конец чтения, а fds[i][1] представляет конец записи.


ЕслиВы не хотите использовать двумерный массив, тогда вы можете объявить массив с 20 int с, как показано ниже, и использовать подход, основанный на смещении, чтобы передать и прочитать fd's.

 int fds[20];
 for(i=0; i<10; i++){
       pipe(fds+i*2);
    }

Тогда fds[i*2]представляет конец чтения, а fds[i*2+1] представляет конец записи.

...