我正在尝试使用gcc在ubuntu上创建一个共享库
我只有一个简单的类(shared.h和shared.cpp)和一个使用它的客户端(main.cpp)
这是我的makefile,我仍然无法来编译程序。
all:
#compile object(fPIC: creates position independent code)
gcc -fPIC -Wall -g -c shared.cpp
#compile shared library
gcc -shared -Wl,-soname,libshared.so.1 -o libshared.so.1.0.1 shared.o -lc
#link shared library
gcc -g -o main main.cpp -L. -lshared
Run Code Online (Sandbox Code Playgroud)
我不想安装该库,我只想能够从当前目录链接它。我已经尝试过:export LD_LIBRARY_PATH=.
但似乎没有什么区别。一切都在当前目录中。
错误:/usr/bin/ld:找不到 -lshared
如何让编译器检查我的库的当前目录?
一点思考实验......成分1:(预编译)共享库中的一个类,它具有一个指向从ostream派生的对象的指针的函数:
void ClassName::SetDefaultStream(std::ostream *stream)
Run Code Online (Sandbox Code Playgroud)
成分2:
我自己的类派生自std :: ostream,带有一些通用的模板化流操作符:
class MyStream : public std::ostream
{
public:
template <typename T> MyStream &operator<<(const T &data)
{
std::cout << data;
return *this;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我将此类的实例化地址传递给SetDefaultStream方法,会发生什么?在编译时,编译器不知道将在共享类中将哪些类型应用于流,因此肯定不会合成任何代码?它会无法编译,它会编译然后在运行时崩溃,会从计算机中冒出来吗?
我想在两个进程之间创建一个共享内存.我用了fork().一个孩子试图改变这个共享记忆,母亲创造另一个孩子,所以新孩子试图改变相同的记忆.这是我在C编程中的代码.(Ubuntu的)
mylist ch=NUL;
f=fork();
if(!f){
pba=shmget(KEYSHM,sizeof(char),0); /*created shared memory*/
ch=(mylist *) shmat(pba,0,0);
ch->name=ugur;
ch->surname=cedric;
...do something...
}
else{
if(ch)
printf("this is top of mylist %s"ch->name);
.......do something
}
Run Code Online (Sandbox Code Playgroud)
它永远不会写ch-> name.为什么?我创建了一个共享内存.为什么父进程无法读取?
我是VB.NET的新手,将遗留系统转换为.NET世界.最近我一直在审查现有的代码,因为我在团队中很晚才加入了这个项目.
所以我发现许多类中有许多共享函数(不是共享类).我怀疑这可能会产生一些问题,如果两个请求(即两个不同的HTTP请求同一个方法,因为它是一个WCF应用程序,当然暴露的方法不共享但内部调用的方法是共享的)来到相同的共享方法和两个调用该方法可能有不同的方法参数/参数,覆盖彼此的参数.
简而言之,如果共享方法有一个将要处理的参数列表,那么鉴于通过两个http请求多次访问共享方法,是否存在任何不一致的可能性.
我会感谢每一个回应线程.
谢谢,JJ
我有两个c文件:producer.c和consumer.c.Consumer在内存中创建共享缓冲区,并等待生产者将项目放入缓冲区以供使用.生产者将共享内存附加到其内存映射,然后开始将项目放入缓冲区.
问题是如何编译和运行它们?
这是实际的任务.(我知道我可以使用一个c文件使用线程,但这不是我被要求做的.)
在这一部分中,您将开发一个生产者 - 消费者应用程序,它将使用共享内存进行进程通信(POSIX共享内存,而不是System V共享内存).将有N个生产者和N个消费者.N可以是1,2或3.
您将开发一个生产者程序(producer.c)和一个使用者程序(consumer.c).启动时,生产者程序将创建N个子进程,这些进程将充当N个生成器(即每个子进程将是生产者进程).
类似地,当启动时,消费者程序将创建N个子进程,其中每个子进程将充当消费者进程.你会认为消费者被识别为0,1,2,取决于N.例如,如果N是2,那么将有两个消费者,0和1.
消费者计划将首先运行.运行时,使用者程序将首先创建大小为4 KB的共享内存.这个共享内存将是您将拥有共享单个缓冲区的位置.生产者和消费者可以访问缓冲区.缓冲区大小为100.它最多可以容纳100个项目(整数).在共享内存中,您可以使用其他一些您认为必要的共享变量.消费者程序还将创建一个或多个信号量(您决定了多少).
然后它将使用fork()系统调用创建N个子进程(N个使用者)(您不需要使用exec()系统调用).在创建子进程之后,消费者程序(父进程)的主要进程不应该终止.它应该等到所有孩子(即消费者)完成任务并终止.当所有子节点终止时,它将从系统中删除(删除)共享内存.它还将删除(删除)信号量.然后它也可以终止.
每个生产者将读取正整数的输入文件(每行一个整数),并且只通过位于生产者和消费者之间的共享内存(由消费者程序创建)中的共享缓冲区传递整数.
如果z mod N等于消费者的ID,则每个消费者将从共享缓冲区读取整数并将接收的整数z写入与消费者相关联的输出文件.例如,如果N为3且消费者的ID为2且消费者已收到整数7,则它将不执行任何操作(忽略),但如果它收到8,则会将整数写入其输出文件.输出文件将在一行中包含一个整数.当生产者和消费者访问共享缓冲区时,他们应该使用信号量以便访问同步.另外,如果缓冲区已满,生产者应该睡觉,如果没有消费,消费者应该睡觉.我们不应该忙着等待.您将使用POSIX信号量(命名信号量).消费者计划将按如下方式调用:
消费者N ...这里,N是要创建的使用者进程的数量.此参数的值必须与生产者程序的相应参数相同.这里是消费者将使用ID X的输出文件的名称.输入的输出文件名的数量将等于N.是我们可以用来标识共享内存的名称.是我们可以用来标识信号量的名称(它可以是可用于许多信号量名称的前缀).调用生产者时必须使用这些相同的名称.生产者程序将被命名为生产者,并将使用以下参数调用:
producer N ...这里,N是生产者的数量.它是生产者X的输入文件的名称.输入文件是存储整数的文本文件.我们输入的输入文件名的数量将等于N.文件中可以有一个或多个整数.输入文件可能非常庞大(数十亿整数).是我们可以用来识别共享内存的名称.是我们可以用来识别信号量的名称.
程序的示例调用可以如下所示.
消费者3 out0.txt out1.txt out2.txt mysmem mysemaphores producer 3 in0.txt in1.txt in2.txt mysmem mysemaphore
我正在构建一个应用程序系统,用于侦听转储到smb共享驱动器上共享的文件夹中的文件.我已经将smb驱动器安装到机器上,我不应该能够做一个简单的file.open()吗?
file = open("//drive/location/of/file/file.txt")
lines = file.readlines()
for line in lines:
print line
file.close()
Run Code Online (Sandbox Code Playgroud)
我在使用Snow Leopard的Mac上,我必须承认我更习惯于Windows开发,所以我可能会误解某些东西.任何帮助将非常感激.
我已经看到了几个类似的堆栈溢出问题,比如这个问题使用pysmbc来读取samba上的文件
但这些是关于以编程方式连接,我已经将驱动器映射到我的机器.
嗨我有内核功能,我需要比较字节.我想要搜索的区域被分成块,因此4k字节的数组被分成4k/256 = 16个块.块中的每个线程都在idx上读取数组,并将其与另一个数组进行比较,这就是我想要搜索的内容.我通过两种方式做到了这一点:
1.比较全局内存中的数据,但块中的线程通常需要读取相同的地址.
2.将数据从全局内存复制到共享内存,并以与上述相同的方式比较共享内存中的字节.读同一地址仍有问题.复制到共享内存如下所示:
myArray[idx] = global[someIndex-idx];
whatToSearch[idx] = global[someIndex+idx];
Run Code Online (Sandbox Code Playgroud)
其余的代码是一样的.仅在共享阵列中执行对示例2中的数据的操作.
但是第一个选项比共享内存快10%左右,为什么?谢谢你的解释.
我正在尝试为属性编写一个通用的自定义验证器,使其通用我需要在闭包内对字段名称的引用,代码如下在config.groovy
grails.gorm.default.constraints = {
nameShared(validator: {val, obj, errors->
Pattern p = Pattern.compile("[a-zA-Z0-9-]{1,15}")
Matcher m = p.matcher(val)
boolean b = m.matches()
if(!b)
errors.rejectValue('name', "${obj.class}.name.invalid", "Name is invalid")
})
Run Code Online (Sandbox Code Playgroud)
在我的域类中
class Student{
String name
static constraints = {
name(shared:'nameShared')
}
}
class Teacher{
String firstName
String lastName
static constraints = {
firstName(shared:'nameShared')
}
}
Run Code Online (Sandbox Code Playgroud)
我想对name和firstName使用相同的验证器,但由于我在验证器中对fieldName进行硬编码,它将始终用于name而不是firstName,所以我想知道是否有任何方式我可以获得对fieldname并使验证器通用,请帮助
我需要在没有清除命令的情况下使用Matlab释放内存(我在并行工具箱的parfor循环中,无法调用clear);我读的是,例如,
clear v
Run Code Online (Sandbox Code Playgroud)
我可以设定
v=[]
Run Code Online (Sandbox Code Playgroud)
问题是:使用'= []',我会取消分配'v'的内存,或者只是将v设置为空值,并且先前的内存仍在分配,然后无法使用?谢谢
我有以下单例课程:
class Singleton {
static let sharedInstance = Singleton()
}
Run Code Online (Sandbox Code Playgroud)
在网上几乎找不到关于如何使用Singleton模式的众多快速实现的信息。我以前在Objective-C的先前应用程序中使用过它,但对我来说似乎更直接了。
例如,如果我想创建可以在应用程序中的任何地方使用的自定义对象数组,那么我将如何声明它以及如何实现它。在我的Objective-C Singleton类中,我在类文件中创建全局变量,然后像这样实现它:
singletonClass *mySingleton = [singletonClass sharedsingletonClass];
mySingleton.whatever = "blaaaah"
Run Code Online (Sandbox Code Playgroud)
感谢您的帮助!我也是这里的新手,也是Swift的新手。