LINUX.ORG.RU

Сообщения Snorri

 
Форум — Development

Обработка прерванного вызова функции EINTR

 ,

Здравствуйте.

есть вот такой код

ssize_t ret;
while (len != 0 && (ret = read (fd, buf, len)) != 0) {
    if (ret == –1) {
        if (errno == EINTR)
               continue;
        perror ("read");
        break;
   }
len -= ret;
buf += ret;
}

и следующее описание

В этом фрагменте кода обрабатываются все пять условий. Цикл считывает len байт с актуальной файловой позиции, равной значению fd , и записывает их в buf. Разумеется, значение buf должно быть как минимум равно значению len . Чтение продолжается, пока не будут получены все len байт или до достижения конца фай­ла. Если прочитано ненулевое количество байтов, которое, однако, меньше len, то значение len уменьшается на количество прочитанных байтов, buf увеличивается на то же количество и вызов повторяется. Если вызов возвращает –1 и значение errno , равное EINTR, то вызов повторяется без обновления параметров. Если вызов возвращает –1 с любым другим значением errno, вызывается perror(). Он выводит описание возникшей проблемы в стандартную ошибку, и выполнение цикла пре­кращается. пробую этот код запустить(упрощенный вариант):

int main()
{	
    ssize_t ret;
    int buf[16];
    int len = 16;

    int fd;
    fd = open("./data", O_RDONLY);

    while (len != 0 && (ret = read (fd, buf, len)) != 0)
    {
        if (ret == -1)
        {
            if (errno == EINTR)	continue;
            perror ("read");
            break;
	}
        
        printf("%s", buf);
	len -= ret;
	buf += ret;
    }
}

как я полагаю: buf - 16 байт, len - 16 байт, те мы считываем из fd 16 байт (len), в буфер buf, который тоже 16 байт. непонятно как буфер

buf увеличивается на то же количество

считываем мы по 16 байт, потом считали 10, допустим, и зачем нам увеличивать буфер (и как его увеличивать?) и уменьшать длину (len). Если read прервали, то мы просто считываем заново - continue… не «догоняю» момент с изменеием len и buf

Snorri
()
Форум — Development

Загрузка программы в gdb с параметрами и брейкпоинтами

 ,

Здравствуйте. OS: fc29 Compiler: GCC 8 Компилирую: gcc -O0 -g prog.c -o prog

prog.c

#include <stdio.h>
int main(int argc, char *argv[])
  { 
    int N = atoi(argv[1]), M = atoi(argv[2]), K = atoi(argv[3]);
    M+=1;
    printf("first=%d, second=%d, third=%d", N, M, K);
  }
gdb
(gdb) file prog
файл загружается, а как передать параметры? пробовал
gdb --args file prog --10 --20 --30
не срабатывает. как правильно? после хотелось бы поставить брейк, например
(gdb) wa M

Snorri
()
Форум — General

Восстановить Grub2

 , ,

Здравствуйте. Установлено две операционные системы: Win и Fedora27. Загружается только Win. Раньше был мультизагрузчик, но после обновления версии Win исчез.

Как восстановить Grub2, чтобы можно было выбрать ОС?

Snorri
()
Форум — General

Установка NodeJS v8.9 Fedora 26

 ,

Здравствуйте

Вышла стабильная версия NodeJS v8.9, сейчас у меня установлена v6.11. Скачал NodeJS v8.9 с офф сайта, там node-v8.9.0-linux-x64.tar.xz, распаковал - дерево, никаких инсталяторов, .sh и тому подобное. Как сие устанавливать то? OS: Fedora 26. До этого устанавливал командой dnf install nodejs, сейчас же dnf говорит, что пакет установлен и делать нечего.

Snorri
()
Форум — General

Некорректная работа JRE

 ,

Здравствуйте.

Установил Fedora 26.

Установил JRE 1.8_152, JDK 1.8_152

при работе WebStorm или NetBeans комп зависает (идёт непрерывное обращение к HDD)

команды

java -version

javac -version

работают корректно

установил system-switch-java, так эта прога показывает только OpenJDK 1.8_144 и выбирать не из чего.

Подскажите, как сие исправить?

Snorri
()
Форум — Development

php 7, apache 2.4 (Fedora 25)

 , ,

Здравствуйте. Не могу состыковать php 7 c apache 2.4 Устанавливается и то, и другое, но апач не видит пхп, тк не создается модуль LoadModule php7_module modules/libphp7.so почитал php.net , но...

cd ../php-NN ./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql make make install

что нужно указать вместо --with-apxs2=/usr/local/apache2/bin/apxs для fedora 25 в этой строке же дело? надо как-то установить php 7 так, чтобы он создал модуль и добавил файлик в директорию... Но как не пойму.

Snorri
()
Форум — Desktop

Проблему с установкой и запуском ПО (Fedora 25)

 ,

Здравствуйте.

Установил Fedora 25 Workstation и началось ... Решил установить скайп: нашел

https://www.if-not-true-then-false.com/2012/install-skype-on-fedora-centos-red-hat-rhel-scientific-linux-sl/

на команду

tar xvf skype-4.3* -C /opt/skype --strip-components=1

получаю

tar: skype-4.3.0.37.tar.bz2.1: Не найден в архиве

tar: skype-4.3.0.37.tar.bz2.2: Не найден в архиве

tar: skype-4.3.0.37.tar.bz2.3: Не найден в архиве

tar: Завершение работы с состоянием неисправности из-за возникших ошибок

ладно, думаю... пойду, качну с оффсайта https://go.skype.com/linux.rpm и ...

An error occurred during a connection to go.skype.com. >Invalid OCSP signing certificate in OCSP response. Error >code: SEC_ERROR_OCSP_INVALID_SIGNING_CERT

на любые команды типа

nautilus &

получаю

Unable to init server: Не удалось подключиться к: >Connection refused

изучаю Linux (точнее ОС на этом ядре) не так давно. Ставил CentOS 7 и не было никаких проблем, но постоянно, когда искал какое-нибудь ПО, то находил ссылки для Fedora. Вот и решил установить Fedora. Это ж workstation и пишут мол «установил и всё работает». Чего-то нифига не работает... Или я совсем бот, или надо садиться и неделю курить форумы и мануалы, чтобы скайп установить и запустить nautilus?

Snorri
()
Форум — Development

Программирование Linux С и С++

 , ,

Здравствуйте. Можно ли использовать С++ при программировании Linux? Поясню вопрос: в книгах по программированию под Linux примеры на С, я пробовал писать в С++ и вроде работает, но все ли так однозначно? На С++ просто удобнее, имхо, строки, например, обрабатывать и еще ряд «плюшек». Но может есть некие тонкости, о которых я, в силу не опытности не подозреваю? А можно ли часть программы писать на С(file1.c), а часть на С++(file2.cpp) - будет ли такое компоноваться потом?

Snorri
()
Форум — Development

pipe() для дерева процессов

 ,

Решил вынести в отдельную тему: есть дерево (не суть какое). запускается процесс и далее используя структуру (ациклический граф) список «разворачивается» в соответствующую графу структуру процессов, отсекая от графа себя и передавая остаток графа дальше. в родителе создаю pipe(), а далее он наследуется. вопрос, собственно: процессы (узлы графа) смогут между собой коммуницировать используя один, созданный родителем, pipe или надо для каждой пары узлов отдельный pipe делать? пример перед глазами есть: пример взаимодействия двух процессов-братьев через канал,созданный в родительском процессе. если построить дерево поцессов, то они смогут общаться через pipe предка или нет? или для каждой нужной пары узлов дерева нужно создавать свою коммуникацию(не обязательно pipe)

Snorri
()
Форум — Development

fork()+exec()+pipe()

 , ,

Здравствуйте. Вопрос по коду:

 1 pid_t pid;
 2 pid = fork ();
 3 if (pid == –1)
 4 perror ("fork");
 5 /* дочерний ... */
 6 if (!pid) {
 7 const char *args[] = { "windlass", NULL };
 8 int ret;
 9 ret = execv ("/bin/windlass", args);
10 if (ret == –1) {
11 perror ("execv");
12 exit (EXIT_FAILURE);
 }
}

Родительский процесс продолжает выполняться, как и ранее, за исключением появления у него нового дочернего.
Вызов execv() влияет только на дочерний про­цесс, заставляя его выполнить программу /bin/windlass.

Почему execv() применяется именно к дочернему, созданному fork(), процессу, а не к родительскому?

Второй вопрос: есть дерево (не суть какое). запускается процесс и далее используя структуру (ациклический граф) список «разворачивается» в соответствующую графу структуру процессов, отсекая от графа себя и передавая остаток графа дальше. в родителе создаю pipe(), а далее он наследуется. вопрос, собственно: процессы (узлы графа) смогут между собой коммуницировать используя один, созданный родителем, pipe или надо для каждой пары узлов отдельный pipe делать?

Snorri
()

RSS подписка на новые темы