LINUX.ORG.RU

Сообщения Negative

 

g++ и typeid

Тестовая программка:

#include <iostream>
#include <typeinfo>

using namespace std;

int main()
{
int c;
char* s1;
char s2[10];
enum Lang {rus, eng, none};
Lang lan = rus;
cout << typeid(c).name() << endl;
cout << typeid(&c).name() << endl;
cout << typeid(s1).name() << endl;
cout << typeid(&s1).name() << endl;
cout << typeid(s2).name() << endl;
cout << typeid(&s2).name() << endl;
cout << typeid(lan).name() << endl;
cout << typeid(&lan).name() << endl;
return 0;
}

Компилим, запускаем, вывод:
i
Pi
Pc
PPc
A10_c
PA10_c
Z4mainE4Lang
PZ4mainE4Lang

Я думал, будет что-то типа int, char и т.д. Это фишка g++ или я что-то забыл? Как понять эти загадочные записи, особенно для enum'a? Где про это можно почитать?

p.s. пробовал на версиях 4.1.1 и 3.4.6.

Negative
()

Вытащить скрипты из RPM

Каким образом можно вытащить скрипты триггеров %pre, %post и прочих из готовой рпмки?
В документации написано rpm -qp --triggerscripts rpm_file, но не работает ни на одной из моих систем.

Заранее спасибо.

Negative
()

RPM Conflicts tag работает неправильно

есть две программы, назовем их A и B
в spec'e для A написано Conflicts: B
в spec'e для B написано Conflicts: A

на новых системах схема работает, A и B не ставятся вместе и не обновляют друг друга
на старых системах (rpm < 4.2) схема работает непонятно:
rpm -i A при установленном B ругается, наоборот тоже
rpm -U A без проблем обновляет B, наоборот тоже

вопроса два - почему А обновляется при установленном В? почему А вообще обновляет В, это же разные пакеты?

можно ли исправить такое поведение RPM?

Negative
()

Linux threads ведут себя о разному

Есть простенькая программа (пример взят из Advanced Linux Programming):
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
void* thread_function (void* unused)
{
fprintf(stderr, "Child thread PID = %d\n", (int) getpid());
while(1);
return NULL;
}

int main ()
{
pthread_t thread;
fprintf(stderr, "Main thread PID = %d\n", (int) getpid());
pthread_create (&thread, NULL, &thread_function, NULL);
while(1);
return 0;
}

и есть 4 Linux-системы (в скобках версия ядра) - Slackware 10.2 (2.6.12.5), Slamd64 10.1 (2.6.11.10), RedHat 9.0 (2.4.20-8) и RedHat 7.0 (не знаю)

Компилируем программу: gcc prog.c -o prog -lpthread

Запускаем эту программу на Slamd64 и RedHat7.0 и смотрим ps ax -L:
27530 27530 pts/2 R+ 0:04 ./prog
27531 27531 pts/2 S+ 0:00 ./prog
27532 27532 pts/2 R+ 0:02 ./prog
Все как должно быть (и как написано в книге) - основной поток, один дочерний thread и один управляющий thread, pid и LWP у всех разный

Запускаем эту программу на Slackware и RedHat9.0 и смотрим ps ax -L:
18544 18544 pts/5 Rl+ 0:00 ./prog
18544 18545 pts/5 Rl+ 0:00 ./prog
Управляющего потока нет, pid одинаковый

strace ./prog на Slamd64:
--cut--
clone(child_stack=0x503070, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND) = 27543
--cut--

strace ./prog на Slackware:
--cut--
clone(child_stack=0xb7e44504, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLO NE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0xb7e44bf8, {entry_number:6, base_addr:0xb7e44bb0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}, child_tidptr=0xb7e44bf8) = 18538
--cut--

Очевидно, что разница во флагах вызова clone. Но блин, почему? Откуда эта разница берется и как ее исправить?

Negative
()

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