LINUX.ORG.RU

Сообщения Kronick

 

Поиск работы в Амстердаме

Доброго дня,

может быть есть кто-то кто работает/работал в Амстердаме или вообще в Нидерландах и может подсказать сайты для поиска работы там?

Перемещено leave из job

 , ,

Kronick
()

Вопрос по LDD, модулю ядра scull.

Пытался написать его сам(и написал каким-то чудом). Но совершенно не понимаю как что-то дописывать в конец файла, и должно ли оно так работать, вот к примеру:

root@test-VirtualBox:~# echo 1 > /dev/mynull 
root@test-VirtualBox:~# cat /dev/mynull 
1
root@test-VirtualBox:~# echo 2 >> /dev/mynull 
root@test-VirtualBox:~# cat /dev/mynull 
2

Меня вот что интересует - оно так и должно работать? Или оно должно писаться в конец как и положено(при работе с обычными файлами), то есть в примере выше должно быть «12» после таких операций.

Чтобы долго не искали, вот пример кода: https://github.com/sergei-krainov/cs_dev

в функции «write» параметры «count» и «*fpos» передаются всегда одинаково, вне зависимости от способа записи(>/>>).

Ну и вопрос, оно вообще должно так работать или в коде где-то ошибка?

 , ,

Kronick
()

Нужен совет как дальше жить

Добрый день,

В первую очередь хотел бы задать вопрос к ckotinko и i-rinat. Вас я считаю весьма адекватными и опытными и прошу вашего совета. Но не откажусь от совета кого-либо другого.

Заранее извиняюсь если кастанул не по адресу. В общем ситуация такова:

Я знаю что оба работали/работаете с С, с чистым С. Возможно ли человеку без реального опыта работы каким-либо образом прокачать в этой сфере настолько хорошо, что можно будет найти работу где-нибудь в Европе? Ситуация у меня такая, что живу в Минске и контора, которым нужен разработчик С, единственная, и туда я точно не пойду.

Возможно ли взять и присоединиться к какому-нибудь опенсорсному проекту на С и в перспективе получить оффер в Европу? Может быть нужно реализовать свой проект для этого, и если да, то какой?

Если это возможно, то смогу ли я это сделать занимаясь этим часа по 2 каждый день?

Не подумайте что я какой-нибудь тракторист, просто мне в самом деле нравится С, я бы и для линуксового Ядра что-нибудь писал и драйверы бы пилил. Но меня останавливает то, что там где живу работы такой нет, и даже если я потрачу туда пару-тройку лет, то это может закончиться ничем. В конечном итоге все чего я хочу - это работать на фулл тайм с С.

Образования у меня именно по железу нет, все изучаю сам по книгам, по физике то же самое, знания на уровне пятого класса школы. Я готов все это выучить, но не знаю получится ли что-то в перспективе.

Ну или может быть нет никакого смысла в этом всем и мне лучше продолжать работу с С++ и Qt?

Я кастовал ckotinko еще по одной причине. Я знаю что ты работал в AMD, так вот зная как оно там, могут ли взять такого самоучку туда или просто посмеются надо мной?

Перемещено leave из development

 

Kronick
()

Qt printf не отрабатывает

Создал в Qt проект, на чистом С, там всего вот эти строки:

#include <stdio.h>

int main()
{
    printf("Hello World!\n");

    return 0;
}

И вот не выводится ничего, в pro файле есть «CONFIG += console». OS - Windows7.

Может кто-то подсказать что тут не так? Программа отрабатывает и показывает «Press return to close this window», и никакого приветствия

 

Kronick
()

Многопоточность в С++11

Всем привет, читаю в данный момент книгу по многопоточности в С++, так вот там есть примерно такой код:

template<typename Iterator,typename T>
T parallel_accumulate(Iterator first,Iterator last,T init)
{
unsigned long const length=std::distance(first,last);
if(!length)
return init;
unsigned long const min_per_thread=25;
unsigned long const max_threads=
(length+min_per_thread-1)/min_per_thread;
unsigned long const hardware_threads=
std::thread::hardware_concurrency();

Я надеюсь что по контексту будет примерно понятно что код делает.

Может быть кто-то знает почему min_per_thread=25? В гугле найти не могу, в книге объяснений нет, единственное:

«Although this is quite a long function, it’s actually straightforward. If the input range is empty B, you just return the initial value init. Otherwise, there’s at least one element in the range, so you can divide the number of elements to process by the minimum block size in order to give the maximum number of threads c. This is to avoid creating 32 threads on a 32-core machine when you have only five values in the range.»

 ,

Kronick
()

QT 5.8 не генерит исходники из ui файла

Проблема следующая, в книжке по QT(старой версии, 4 вроде бы) описано что можно и нужно из ui файла генерить хотя бы .h файл, чтобы использовать весь функционал, да и наследовать там что-то можно, вот строки оттуда:

Now run qmake to create a .pro file and a makefile (qmake -project; qmake gotocell.pro). The qmake tool is smart enough to detect the user interface file gotocelldialog.ui and to generate the appropriate makefile rules to invoke uic, Qt's user interface compiler. The uic tool converts gotocelldialog.ui into C++ and puts the result in ui_gotocelldialog.h.

Но этот хедер не создается так просто, пытался сделать подобное и на винде и вот на Федоре, результат один и тот же. Я конечно нашел как пофиксить, на второй страницы гугла форум на китайском языке где сплошные иероглифы, но советуют добавить вот это в pro файл:

QT += widgets

Только после этого я увидел .h файл. Причем ни в официальной документации, вообще нигде это не описано.

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

 

Kronick
()

Посоветуйте Open-Source проект, или могу подключиться к вашему

Всем доброго времени суток,

возможно ничего и не выйдет, но попытка не пытка. Может быть кому-то нужна помощь на каком-либо Open-Source проекте где нужно C++, или кто-то может посоветовать какой-либо проект, на который я смогу подключиться?

Почему мне это нужно? Да потому что на текущее мое положение плачевно, хочу писать на C++, чертовски сильно хочу, но работу сменить я не могу потому что нет практического подтверждения что я что-либо могу у меня нет. Вот я и хочу подключиться к какому-нибудь проекту, чтобы при смене работы я мог показать коммиты в него и доказать что я что-либо могу.

Про себя - разработчик на Perl уже как 3 года на внутреннем проекте IBM, скрипты мониторинга в основном. За плечами K&R, пара книжек про системное программирование, опять же на C, книжка по C++. Есть репозиторий c примерами кода, но там не особо густо, есть самописный аналог 'ls -l' на С, с потоками и всем остальным, но выложить так не могу, потому что это было в рамках внутреннего обучения, у меня могут быть проблемы потом, могу по почте выслать.

С++ потому-что в моем городе вакансии только по C++ есть, я бы рад на C что-то делать, но работу я потом не найду, а конечная цель - именно найти работу.

 ,

Kronick
()

Требуется железо для написания USB драйвера

Всем привет, хотелось бы начать с написания драйверов под линукс, но вот небольшая загвоздка. В linuxjournal есть прекрасная статейка как это сделать на простой железке:

http://www.linuxjournal.com/article/7353

Не ну в самом деле, чего может быть такого особенного? Там ведь всего лишь 3 светодиода и usb контроллер, да вот только стоит она 100 баксов:

https://www.delcomproducts.com/products_usblmp.asp

Это уже какой-то явный перебор. Может кто-нибудь посоветовать какое-либо простое USB устройство для которого можно легко написать драйвер и стоит нормальное количество денег?

 

Kronick
()

vlc не компилируется в buildroot

Доброго вечера всем, при использовании утилиты buildroot не компилируется vlc, использую internal toolchain, ядро самое последнее, все прочие проблемы устранил, теперь вот проблемы с vlc и как из решить мне не очень понятно, вот что пишется в логе:

In file included from ../config.h:799:0,
                 from misc/picture.c:32:
../include/vlc_fixups.h:243:33: error: expected identifier or ‘(’ before ‘void’
 # define _Static_assert(x, s) ((void) sizeof (struct { unsigned:-!(x); }))
                                 ^
../include/vlc_fixups.h:244:24: note: in expansion of macro ‘_Static_assert’
 # define static_assert _Static_assert
                        ^
misc/picture.c:43:1: note: in expansion of macro ‘static_assert’
 static_assert(sizeof (uintptr_t) == sizeof (atomic_uintptr_t),
 ^
../include/vlc_fixups.h:243:39: error: expected ‘)’ before ‘sizeof’
 # define _Static_assert(x, s) ((void) sizeof (struct { unsigned:-!(x); }))
                                       ^
../include/vlc_fixups.h:244:24: note: in expansion of macro ‘_Static_assert’
 # define static_assert _Static_assert
                        ^
misc/picture.c:43:1: note: in expansion of macro ‘static_assert’
 static_assert(sizeof (uintptr_t) == sizeof (atomic_uintptr_t),
 ^
../include/vlc_fixups.h:243:33: error: expected identifier or ‘(’ before ‘void’
 # define _Static_assert(x, s) ((void) sizeof (struct { unsigned:-!(x); }))
                                 ^
../include/vlc_fixups.h:244:24: note: in expansion of macro ‘_Static_assert’
 # define static_assert _Static_assert
                        ^
misc/picture.c:45:1: note: in expansion of macro ‘static_assert’
 static_assert(alignof (uintptr_t) == alignof (atomic_uintptr_t),
 ^
../include/vlc_fixups.h:243:39: error: expected ‘)’ before ‘sizeof’
 # define _Static_assert(x, s) ((void) sizeof (struct { unsigned:-!(x); }))
                                       ^
../include/vlc_fixups.h:244:24: note: in expansion of macro ‘_Static_assert’
 # define static_assert _Static_assert
                        ^
misc/picture.c:45:1: note: in expansion of macro ‘static_assert’
 static_assert(alignof (uintptr_t) == alignof (atomic_uintptr_t),
 ^
make[5]: *** [misc/picture.lo] Error 1
make[5]: *** Waiting for unfinished jobs....
make[4]: *** [all] Error 2
make[3]: *** [all-recursive] Error 1
make[2]: *** [all] Error 2
make[1]: *** [/home/sergei/embedded/buildroot/output/build/vlc-2.2.4/.stamp_built] Error 2
make: *** [_all] Error 2

Может быть кто-то может подсказать как именно решить эту проблему и на каком уровне ее вообще обычно решают? Нужно переписывать код самого vlc? Или же в builroot есть какая-то возможность устранять подобные проблемы? Дополнительные опции для компилятора или вроде того? Буду признателен за любую помощь или подсказку

 ,

Kronick
()

Клиент-сервер не работает на федоре 20

Всем привет, пишу вот свое первое клиент-серверное приложение на С, написал самые базовые функции, стиля принять-отправить сообщение. На убунте все нормально - иду на федору, компиляю, запускаю - и все виснет намертво. Путем тыкания в случайные места кода - нашел что виснет на данном вызове:

new_sock = accept(def_sock, (struct sockaddr *) &n_addr, &addr_size)

Я чего-то не знаю? Может кто сталкивался?

Код сервера: http://pastebin.com/T6t2kHir

Код клиента: http://pastebin.com/uuNfmVak

2) Пытался юзать fork() - взял стандартный пример из какой-то книжки, и не компиляется, проблема вот в этом:

void sigchld_handler(int signo)
{
	while(waitpid(-1, NULL, WHOHANG) > 0);
}

Компилятор стабильно показывает следующее:

 [test@localhost cs_app]$ make
rm -f server client
gcc -Wall -g -std=c99 -Werror server.c -o server
server.c: In function ‘sigchld_handler’:
server.c:14:26: error: ‘WHOHANG’ undeclared (first use in this function)
  while(waitpid(-1, NULL, WHOHANG) > 0);
                          ^
server.c:14:26: note: each undeclared identifier is reported only once for each function it appears in
make: *** [server] Error 1

Все хедеры включены, перерыл первые 2 страницы гугла - совершенно ничего, а если нет ответа в гугле - значит я что-то делаю не так. Может быть кто-то знает что здесь не так? Код ниже:

http://pastebin.com/XSasNSCx

Буду крайне признателен за любую помощь, хотя бы дайте какую-нибудь подсказку

 ,

Kronick
()

Чтение и запись файла в модуле ядра

Всем привет, очень нужна помощь с пониманием логики модулей ядра.

Есть одно задание - написать модуль ядра, на входе у него 3 файла. В двух текст, нужно текст склеить и записать его в третий файл. Есть еще упоминание что работать это должно через /proc

Я уже и гугл весь перерыл и книги все доступные перелистал, но я совершенно не понимаю как это делать.

Из того что я понял по книгам: 1) Модуль общается с ядром и все взаимодействие происходит через память 2) Мы можем читать/писать файлы в /proc 3) Мы можем передать параметры при загрузке модуля в систему через moduleparam.h

И вот модуль загружен, вот есть девайс /dev/test1, есть файлы /tmp/test1, /tmp/test2, /tmp/test3. И каким образом можно получить их содержимое? Я нашел что можно читать/писать /proc, /dev, ибо там уже есть связь User Space - Kernel Space. Вся связь к тому же идет через указатели.

Еще, каким образом это хотя бы примерно должно работать? Есть file_operations, и вот создал я девайс, и могу обратиться к нему либо по Open, либо по Write. Соответственно тут какой-то бред - чтоб склеить файлы мне нужно вызывать «cat /dev/test1»?

Возможно немного сумбурно получилось, но я совершенно не могу понять логики. Буду рад абсолютно любой подсказке

 , ,

Kronick
()

Указатель на функцию

Всем привет, возникла тут непонятная ситуация, и, может быть, кто-нибудь поможет разобраться, буду очень признателен. Проблема связана с указателем на void, преобразованием и указателем на функцию, основные моменты:

void add_num(void *, void *);
void add_str(char *a, char *b);


void (*p)(void*,void*);

if (number) {
    p = &add_num;
} else {
    p = &add_str;
}

Ну и, соответственно, проблема в том, что в 'p = &add_num;' все нормально, потому что указатели на void, сама функция:

void add_num(void *a, void *b) {
    int one, two, result;
    char *c = a;
    char *d = b;
    
    
    printf("Test2, %s:%s\n", c, d);
    one = atoi(c);
    two = atoi(d);
    result = one+two;
    printf("Result = %d\n", result);
    
    itoa(result, r);
}
Тут мы получаем void, переприсваиваем в 'char *' и все работает.

А вот в случае с 'p = &add_str;' Я получаю вот это:

'main.c:38:11: warning: assignment from incompatible pointer type [enabled by default]'

Ну и собственно мой вопрос - программа-то работает, но как избавиться от этого сообщения и что вообще не так? Можно, конечно, сделать так же как и с 'p = &add_num;', но должен же быть и другой путь? Ну и весь код программы:

#include <stdio.h>
#include <stdlib.h>

void add_num(void *, void *);
void add_str(char *a, char *b);
void itoa(int i, char f[]);
void reverse(char rline[]);
char r[200];

int main(int argc, char **argv) {
    char c, number;
    void (*p)(void*,void*);

    number = 0;
    printf("Testing\n");
    printf("%s and %d\n", argv[1], argc);
    
    while ( --argc > 0 && ( **++argv == '-') ) {
        while ( (c = *++argv[0]) ) {
            printf("Test c=%c\n", c);
            switch(c) {
            case 'n':
                number=1;
                break;
            default:
                printf("Please enter valid key\n");
            }
            
        }
    }
    
    /* argv[2] argv[3] */
    printf("Number = %d\n", number);
    
    if (number) {
        p = &add_num;
    } else {
        p = &add_str;
    }
    
    
    
    (*p)((void *)argv[0], (void*)argv[1]);
    printf("test1: %s:%s\n", argv[0], argv[1]);
    /* add_num(argv[0], argv[1]); */
    
    printf("Finally result = %s\n", r);
    
    

    return 0;
}


void add_num(void *a, void *b) {
    int one, two, result;
    char *c = a;
    char *d = b;
    
    
    printf("Test2, %s:%s\n", c, d);
    one = atoi(c);
    two = atoi(d);
    result = one+two;
    printf("Result = %d\n", result);
    
    itoa(result, r);
}


void itoa(int n, char s[]) {
    int i = 0;
    int sign;
    //for (i = 0; i < 5;s[i++] = 5 + '0')
    //sign = ( n < 0) ? -1: 1;
    if ( ( sign = n )  < 0)
        n = -n;
    //printf("%d\n", sign);
    
    if ( sign < 0 )
        i++;
    //printf("%d\n", i);
    do {
        //s[i++] = n % 10 - '0';
        //n /= 10;
        s[i++] = n%10 +'0';
        //n /= 10;
        //printf("%d\n", s[i - 1]);
        
    //} while ( n > 0);
    } while ( ( n/=10 ) > 0 );
    
    if (sign < 0)
        s[i++] = '-';
    s[i] = '\0';
    
    
    
    //printf("%d\n", sign);
};


void reverse(char rline[])
{
  int i,j;
  char temp;

  for(i=0;rline[i]!='\0';++i)
    ;
  --i;
  if(rline[i]=='\n')
  --i;

  j = 0;

  while(j < i)
  {
    temp = rline[j];
    rline[j] = rline[i];
    rline[i] = temp;
    --i;
    ++j;
  }
}

void add_str(char *a, char *b) {
    int i;
    i = 0;
    
    while ( *a != '\0' ) {
        r[i++] = *a;
        a++;
    }
    
    /* if ( *a == '\0')
        i++; */
    while (*b != '\0') {
        printf("Test5: %s\n", b);
        r[i++] = *b;
        b++;
    }
    
}

 ,

Kronick
()

С и символьные массивы

Всем доброго дня. Не так давно я изучаю С изучаю самостоятельно, так же рядом нет людей которые могут помочь и подсказать что-либо, надеюсь на вашу помощь. Собственно вопрос:

Есть в С символьные массивы и функции, и вот в той самой книге K&R описано поведение и вот к примеру код:

#include <stdio.h>
#include <string.h>
void change_a(char b[]);

int main() {
    char a[] = "test\n";
    printf(a);
    
    change_a(a);
    
    printf(a);

    return 0;
}

void change_a(char b[]) {
    int i;
    for (i = 0; i < strlen(b) -1; i++)
        b[i] = '3'; 
    
}

Этот код можно запуститьи увидеть что a[] изменяется. Я понимаю как это работает, я разобрался, да. Но почему оно так работает? Мы передаем массив в функцию, которая ничего не возвращает. Мы не переприсваем новые данные этому массиву в основной функции. Итого передав массив в качестве аргумента к какой-либо функции этот самый аргумент может быть изменен? Я не дошел еще до ссылок, но это не похоже на ссылки. Может кто-то объяснить почему так? Я могу и путать конечно, но разве этой не основа основ? То что передается в качестве аргумента не должно быть изменено, если нет явного присваивания.

 

Kronick
()

С++ с чего начинать реальную работу

Всем привет, очень надеюсь что вы сможете мне помочь.

Не так давно решил уйти из админства и податься в программисты. Очень нравится мне С/С++, но вот ведь незадача, непонятно что именно делать дальше. Суть проблемы в том, что во всех книгах описаны основные функции, циклы, классы и так далее, обычная программа не более 30-40 строк. То есть получается следующее:

1) Учим по книге синтаксис 2) ??? 3) Работаем на крупном проекте

Я сам всему учусь, я читал книги и вот мне совсем не понятен пункт 2. Я думал подключиться к какому-нибудь опенсорс проекту, править баги, писать документацию хотя бы, разбираться что там да как. Но на гитхабе я вижу огромные проекты с кучей разнообразных файлов и ничерта не могу понять. Где эта самая середина? Вот прочитал я пару книг по языку, что делать дальше? Может кто-то сталкивался с такой проблемой?

 ,

Kronick
()

SMB, NFS теория

Не очень понятная вся эта теория. К примеру возьмем smb. Есть линукс хост, который введен в домен, расшарим папку и сделаем доменную авторизацию строкой в конфиге самбы, в данном случае AD Domain:
#================= Global Settings ====================

[global]
workgroup = ADEXAMPLE
security = ads
realm = ADEXAMPLE.COM

(пожалуйста, поправьте если я не прав или этого не достаточно).
Далее моменты, которые я не могу понять:
1) Как быть в случае с ipa доменом? Какой конфиг должен быть в том случае?
2) Допустим, все хорошо и мы расшарили папку по smb, далее авторизация проходит, но как в таком случае раздать права на папку?
2) 'valid users = user1@ADEXAMPLE' или 'valid users = user1' в случае с доменом?
3) Допустим, все хорошо и мы расшарили папку по smb, далее авторизация проходит, но как в таком случае раздать права на папку?
К примеру в конфиге есть строка 'valid users = user1,user2,user3', и расшарена папка '/smbtest'. Как, к примеру, дать права user1 только чтение, а user3 чтение и запись?
Помогут ли тут стандартные rwx права при том, что пользователя на системе нет (авторизация-то доменная), как это реализовать?
4) NFS, та же самая проблема, керберос авторизация, на клиенте и на сервере есть файл /etc/krb5.keytab. в /etc/exports что-то вида «/nfsshare 192.168.0.100(rw,sec=krb5p)».
Вот авторизовались, примонтировали файл на удаленном сервере, и нет прав. Каким образом раздавать права на такую шару и как? Или на все что я примонтировал таким образом на машину 192.168.0.100 будут именно права rw?
5) Допустим, при конфиге из пункта 4, внутри папки '/nfsshare' есть папка '/nfsshare/user1', каким образом раздать права так, чтобы только пользовать user1 (причем авторизация идет по керберос) имел права rw на данную папку, а остальные пользователя даже права на просмотр не имели?

Извиняюсь на сумбур, в голове полная каша и уже несколько недель не могу придти в себя. Спрашивать мне не у кого, учусь всему сам по книжках, простите если пишу очевидные глупости, очень надеюсь на вашу помощь

 ,

Kronick
()

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