Решил попробовать написать С-расширение при помощи SWIG. ( у меня openSUSE 10.3)
Оговорюсь сразу: helloSWIG.c и potok.c мне удалось собрать.
potok.c: Что делает - запускается с -поток , 3 раза печатает си-поток( с интервалом в 1 секунду), затем поток завершается, запускается с-процесс, 3 раза печатается си-процесс, процесс завершается.
Файл: potok.c
/* potok.c */
#include <stdio.h>
#include <pthread.h>
#include <signal.h>
pthread_t potok_id;
void * mypotok()
{
while (1) { fprintf(stderr,"СиПоток\n"); sleep(1); }
}
void pusk() {
pthread_create(&potok_id,NULL,&mypotok,NULL);
sleep(3);
pthread_cancel(potok_id);
if( !pthread_equal( pthread_self(),potok_id ) )
{
printf("\n%d\n", pthread_equal( pthread_self(), potok_id ));
fprintf(stderr,"поток завершен\n");
pthread_join(potok_id,NULL);
}
int i;
for (i=0; i<3; i++) {
fprintf(stderr,"СиПроцесс\n"); sleep(1);
}
}
%module potok
%include potok.c
swig -python potok.i
И наконец компилирую и связываю:
gcc -shared potok.c potok_wrap.c -o _potokmodule.so -I/usr/include/python2.5 -DHAVE_CONFIG -I/usr/lib/python2.5/config
Запускаю python:
>>> import potok
>>> potok.pusk()
СиПоток
СиПоток
СиПоток
0
поток завершен
СиПроцесс
СиПроцесс
СиПроцесс
>>>
Пробую разбить функцию void pusk() на составляющие - void start(), void finish, void pusk()
/* Npotok.c */
#include <stdio.h>
#include <pthread.h>
#include <signal.h>
pthread_t potok_id ; /* идентификатор потока */
void * mypotok()
{
while (1) { fprintf(stderr,"СиПоток\n"); sleep(1); }
}
void start()
{
pthread_create(&potok_id,NULL,&mypotok,NULL);
}
void finish()
{
pthread_cancel(potok_id);
if( !pthread_equal( pthread_self(),potok_id ) )
{
printf("\n%d\n", pthread_equal( pthread_self(), potok_id ));
fprintf(stderr,"поток завершен\n");
pthread_join(potok_id,NULL);
}
}
void pusk()
{
start();
sleep (3);
finish();
int i;
for (i=0; i<3; i++) {
fprintf(stderr,"СиПроцесс\n"); sleep(1);
}
}
~> gcc -shared Npotok.c Npotok_wrap.c -o _Npotokmodule.so -I/usr/include/python2.5 -DHAVE_CONFIG -I/usr/lib/python2.5/config
Выдает:
Npotok_wrap.c: In function ‘potok_id_set’:
Npotok_wrap.c:2494: error: ‘potok_id’ undeclared (first use in this function)
Npotok_wrap.c:2494: error: (Each undeclared identifier is reported only once
Npotok_wrap.c:2494: error: for each function it appears in.)
Npotok_wrap.c: In function ‘potok_id_get’:
Npotok_wrap.c:2506: error: ‘potok_id’ undeclared (first use in this function
Почему ? Что ей надо ? Может кто-нибудь подобное делал ? ( под Windows может быть?)
Заранее спасибо