我有一个主应用程序,它生成一个单独的线程来处理队列中的消息.当我按下CTRL-C时,我在AIX上遇到了一个问题,因为它似乎使线程中的某些"连接句柄"变得无效.我在主程序中有一个关闭钩子来捕获SIGINT但在AIX上它似乎以某种方式向线程发送信号......虽然这听起来不太可能......
基本上我想知道我是否希望MAIN应用程序处理我感兴趣的所有信号,并且线程/ s永远不会处理任何信号......这是"良好实践"吗?
如果是的话我怎么就不能使用"调用sigwait"中的线程...其实我也不想在线程/ s的任何"信号代码" ......他们必须简单地根本不接收任何信号.
我清空了所有的信号:
sigemptyset(&set);
Run Code Online (Sandbox Code Playgroud)
并设置了SIG_BLOCK
s = pthread_sigmask(SIG_BLOCK, &set, NULL);
Run Code Online (Sandbox Code Playgroud)
所以这是一个虚拟测试程序:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>
#define handle_error_en(en, msg) do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)
static void * threadMainLoop(){
//Here I do not want the thread to use "sigwait"....
while(running == TRUE){
//do some thread work and never have any signals come in
}
}
void shutdownHook(int sig){
printf("\nCtrl-C pressed....shutdown hook in main...\n");
}
void …Run Code Online (Sandbox Code Playgroud) 我们已经libgcc使用RPM文件在AIX 6.1上安装了GCC .
我想知道为什么"libgcc_s.a"没有在以下文件夹下创建?
/opt/freeware/lib/gcc/powerpc-ibm-aix6.1.0.0/4.2.0/
Run Code Online (Sandbox Code Playgroud)
libgcc.a该文件夹中有一个但没有libgcc_s.a,链接器似乎想要那个libgcc_s.a文件
我问的原因是,如果我尝试在AIX 6.1上创建一个简单的"hello world"类型的共享库,它会抱怨并且说有些像"cannot find libgcc_s.a".
我运行了一个命令:
find / -name '*libgcc*' -print 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
尝试在tha机器上找到libgcc_s.a但没有什么;-(
知道如何libgcc_s.a进入AIX机器吗?
只是来自"Lua新手"的一个小问题...我一直在使用LuaJIT,它很棒,没有问题是因为LuaJIT是Lua 5.1兼容这意味着我可以使用标准Lua在LuaJIT中使用的所有"LuaRocks" ?
例如,如果我想安装一个SQLite库(例如http://luaforge.net/projects/luasqlite/) - 我将如何在LuaJIT中安装它?
所有可用的"LuaRocks"是否与LuaJIT一起开箱即用?
我来自更多的Python和CTYPES背景......我正在尝试找出从Lua脚本调用标准C共享库的最佳方法.
我听说过"异形"(http://alien.luaforge.net/),但我不确定它是最新的?意思是它定期更新?
例如,我知道他们是一个SQLite Lua库,但是我想说我想调用在编译SQLIte时创建的SQLite共享库?
例如:在我的例子中,lib位于/usr/local/lib/libsqlite3.so中
如果我写一个小的虚拟脚本只是为了看它是否可以加载lib
require "libsqlite3"
print "hello"
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
debian@debian:~/Desktop/SQLite Test$ lua sqlite_test.lua
lua: error loading module 'libsqlite3' from file '/usr/local/lib/lua/5.2/libsqlite3.so':
/usr/local/lib/lua/5.2/libsqlite3.so: undefined symbol: luaopen_libsqlite3
stack traceback:
[C]: in ?
[C]: in function 'require'
sqlite_test.lua:1: in main chunk
[C]: in ?
debian@debian:~/Desktop/SQLite Test$
Run Code Online (Sandbox Code Playgroud)
这是否意味着Lua不能"开箱即用"调用共享库,而且我必须使用像Alien这样的东西?
我知道我也可以这样编写共享库,它包含Lua头文件,我可以制作"Lua函数"......我只是希望我可以调用盒子上"标准"的共享库.
非常感谢帮助或建议;-)
谢谢
林顿
我想知道如何使用execl(或类似的)从我的 C 代码执行 Python(或 Lua 等)脚本?
以下是一些“父/子”代码,显示了我如何使用 PIPES 向孩子发送数据流。代码可能并不完美,但您明白了。注意execl底部:
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define STDIN_FILENO 0 /* Standard input. */
#define STDOUT_FILENO 1 /* Standard output. */
#define STDERR_FILENO 2 /* Standard error output. */
#define MAXLINE 4096
int main(void){
int n, parent_child_pipe[2], child_parent_pipe[2];
pid_t pid;
char line[MAXLINE];
if (pipe(parent_child_pipe) < 0 || pipe(child_parent_pipe) < 0)
puts("Error creating pipes...\n");
if ( (pid = fork()) < 0)
puts("Error forking...\n");
else if …Run Code Online (Sandbox Code Playgroud) 我已经看过LuaJIT教程,网址为:http ://luajit.org/ext_ffi_tutorial.html
我试图深入了解Lua,并想了解在用C语言编写的“ libutility.so”中调用一个简单的“小写”函数对我来说有多么容易。
所以这是我要调用的C函数:
void lowercase(char* str){
int z;
for (z = 0; str[z]; z++){
str[z] = tolower(str[ z ]);
}
}
Run Code Online (Sandbox Code Playgroud)
所以现在我想从Lua调用此函数...这是使用LuaJIT的FFI编写的代码
local ffi = require("ffi")
ffi.cdef[[
void lowercase(char* str);
]]
local utility = ffi.load("utility")
local buf = ffi.new("char[?]", 11)
ffi.copy(buf, "HELLO WORLD")
utility.lowercase(buf)
print("Result: ", #str)
Run Code Online (Sandbox Code Playgroud)
上面的代码不起作用...好吧,我认为在上面的最后一行代码之前,它都起作用。
有人可以给我一些建议,告诉我如何调用此“小写”功能并正确打印出结果吗?
我在 AIX 6.1 上的 C 编译期间收到有关重复符号的警告,它说:
ld: 0711-345 使用 -bloadmap 或 -bnoquiet 选项获取更多信息。
我在谷歌上查过如何使用这些但还没有明确的答案,有人可以告诉我我需要做什么才能使用 -bloadmap 或 -bnoquiet?
谢谢您的帮助 ;-)
林顿
我已经使用 Pipe / fork 等 execv 来执行 C 中的子进程,并且它运行 100%。
本质上,我在父母代码中有以下等待步骤:
wait(&rv); //where rv is just an int of zero
Run Code Online (Sandbox Code Playgroud)
我的问题是:如果孩子因分段错误而崩溃或成为僵尸,父母是否可以“无限期”等待或挂起?
换句话说,如果子代码没有“无限循环”等......父进程是否仍然有可能永远“挂起”等待步骤?
防止手握的最安全方法是什么?我见过 WNOHANG...我应该使用它吗?但我需要等待子进程结束才能继续?
waitpid(-1, &status, WNOHANG)
Run Code Online (Sandbox Code Playgroud)
另外,使用 SIGCHLD 处理程序是最佳实践吗?
谢谢您的帮助
林顿
我一直在研究AIX,看到一些正在运行的进程ID长8。
我正在使用PID作为另一个char *值的串联,并且如果您从“ char角度”看,试图计算出PID的最大可能长度是多少?
我看过pid_t结构(例如t.html“> http://dvbstreamer.sourceforge.net/api/structPID_t.html),它的PID为INT ...
关于这一点,我假设PID是一个“有符号的整数” ....在这种情况下,有符号的整数的最大长度是多少?
谢谢您的帮助
林顿
我想在Lua中编写"映射"而不是在C中编写Lua的简单和美丽;-)
所以我们可以说在CI中可能有以下内容:
typedef struct my_struct{
char field_1[10];
char field_2[250];
char field_3[2000];
}my_struct;
my_struct *pmy_struct;
pmy_struct = (my_struct *) some_buffer;
Run Code Online (Sandbox Code Playgroud)
因此,我想在Lua中使用一种方式在"结构"内的字段上具有固定长度,以便整个BUFFER OFFSETS在到达目标系统时保持一致....
所以让我们在上面的结构中说我想将"field_3"设置为文本"apple"......我仍然希望该结构字段的总长度为2000字节...