我知道我可以使用这个技巧if (fork()) exit(0);来改变当前进程的pid.因此,以下程序的pid变化非常快.如何杀死这样的进程?是否有一些更好的方法比执行大量的方法,killall procname直到一个能够kill()在它之前运行?我知道它不是一个'进程',而是每个运行几微秒的许多进程.
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
pid_t self = getpid();
while (1)
{
if (fork()) exit(0);
if (self + 10000 < getpid()) break; // Just to kill it after some time
usleep(1000);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我发现列出该过程的唯一方法是执行ps -A | grep procname几次,直到一个显示一些输出.为什么不总是列出流程?
我正在构建一个游戏,每个玩家都必须对他的机器人进行编程.关键的想法是播放器将使用C(或C++,或任何兼容的语言)编程,构建DLL并将此DLL发送到服务器,以便没有人可以获取他的代码.问题是:如何确保他没有调用任何非法功能?就像创建文件或打开套接字一样.DLL将加载LoadLibrary并将调用一个函数.所有交互都将在回调函数中发生.一个可能的解决方案是放置一个空的kernel32.dll(和其他),以便所有winapi调用都将失败.这样安全,适用于所有情况吗?有没有更好的方法呢?
请注意,播放器线程(称为dll的那个)必须仍然能够与游戏通信,可能还有一个打开的套接字.在Linux上,这可以轻松完成seccomp.
我在Windows 7(32位)上使用Qt进行项目(Qt 5.0.2,预编译并从qt-project.org下载),我在尝试打印文档时遇到问题.
qDebug() << QPrinterInfo::availablePrinters().size(); // 0
Run Code Online (Sandbox Code Playgroud)
我能够以PDF格式打印,并且我在其他计算机上测试了相同的可执行文件,它运行良好.我确实安装了打印机,我可以从任何其他程序(如记事本或Word)正常打印.任何线索,为什么它返回一个空列表?我无法在任何地方找到这种行为,这是一个Qt错误吗?
有没有办法创建加密的文件流?
我想做这样的事情:
string myString;
fstream myStream;
myStream.create("my path", "my password", cipherAlgorithm);
myStream.write(myString); - this code saves my string to an encrypted stream
myStream.close();
Run Code Online (Sandbox Code Playgroud)
谢谢。
我正在创建一个pastebin应用程序,我希望粘贴的ID是真正随机的./dev/random在Linux上(托管在Linux机器上)使用噪声,因此它的输出是真正随机的.
目前我使用此代码生成ID:
self.guid = Digest::SHA1.hexdigest(Time.new.to_s + (0...50).map{ ('a'..'z').to_a[rand(26)] }.join)
Run Code Online (Sandbox Code Playgroud)
Ruby的rand功能是否使用/dev/random,如果不是,我如何/dev/random在Ruby中使用?谢谢.
我有一个加载库的应用程序dlopen,它看起来像这样:
#include <iostream>
#include <dlfcn.h>
void foo()
{
std::cout << "foo";
}
int main()
{
void* libbar = dlopen("./libbar.so", RTLD_LAZY);
if (!libbar)
{
std::cerr << dlerror() << std::endl;
return 1;
}
void(*bar)() = (void(*)())dlsym(libbar, "bar");
if (!bar)
{
std::cerr << dlerror() << std::endl;
return 1;
}
bar();
dlclose(libbar);
}
Run Code Online (Sandbox Code Playgroud)
这是libbar:
#include <iostream>
void foo();
extern "C"
void bar()
{
foo();
std::cout << "bar" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
输出:
./libbar.so: undefined symbol: _Z3foov
Run Code Online (Sandbox Code Playgroud)
预期产量:
foobar
Run Code Online (Sandbox Code Playgroud)
如何让人foo眼前一亮 …
我试图理解以下函数的反汇编代码.
void func(char *string) {
printf("the string is %s\n",string);
}
Run Code Online (Sandbox Code Playgroud)
下面给出了反汇编代码.
1) 0x080483e4 <+0>: push %ebp
2) 0x080483e5 <+1>: mov %esp,%ebp
3) 0x080483e7 <+3>: sub $0x18,%esp
4) 0x080483ea <+6>: mov $0x80484f0,%eax
5) 0x080483ef <+11>: mov 0x8(%ebp),%edx
6) 0x080483f2 <+14>: mov %edx,0x4(%esp)
7) 0x080483f6 <+18>: mov %eax,(%esp)
8) 0x080483f9 <+21>: call 0x8048300 <printf@plt>
Run Code Online (Sandbox Code Playgroud)
谁能告诉我4-7行是什么意思(不是文字解释).为什么在第3行的堆栈上分配24个字节?
在我开始的C语言程序中,我注意到我自由地调用了很多,所以我想做一个调用一次函数来释放所有东西.这段代码是一种有效的方法,还是有其他建议可以改进它?
#include <stdio.h>
#include <stdlib.h>
void *items_to_free[1024];
int intItemsToFree = 0;
void mm_init(void)
{
int i;
for (i = 0; i < 1024; i++)
{
items_to_free[i] = NULL;
}
}
void mm_release(void)
{
int i;
for (i = 0; i < 1024; i++)
{
if (items_to_free[i])
{
printf("Freeing %p\n", items_to_free[i]);
free(items_to_free[i]);
items_to_free[i] = NULL;
}
}
}
void mm_add(void *p)
{
items_to_free[intItemsToFree++] = p;
}
int main(void)
{
int *i = NULL;
/* initialize memory management */
mm_init();
/* allocate …Run Code Online (Sandbox Code Playgroud) class Testdeck
attr_accessor :cards
def initialize
@cards = []
counter = 0
['H','C', 'S', 'D'].product['2','3','4','5','6','7','8','9','10','J','K','Q','A'].each do |arr|
@cards << Card.new(arr[0], arr[1])
end
end
end
zen = Testdeck.new
puts zen.cards.pop
Run Code Online (Sandbox Code Playgroud)
我花了最后一小时试图修复此错误.我得到的错误是:
wrong number of arugments (Argument Error)
Run Code Online (Sandbox Code Playgroud)