LINUX.ORG.RU

Сообщения Snorri

 

Обработка прерванного вызова функции 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
()

Загрузка программы в 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
()

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

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

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

 , ,

Snorri
()

Установка 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
()

Некорректная работа 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
()

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
()

Проблему с установкой и запуском ПО (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
()

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

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

 , ,

Snorri
()

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

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

 ,

Snorri
()

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 подписка на новые темы