小编Lyn*_*ice的帖子

如何在不使用SIGWAIT的情况下阻止线程中的所有SIGNALS?

我有一个主应用程序,它生成一个单独的线程来处理队列中的消息.当我按下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)

c unix signals pthreads

10
推荐指数
1
解决办法
1万
查看次数

libgcc.a和libgcc_s.a之间的区别?

我们已经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机器吗?

c aix gcc

9
推荐指数
1
解决办法
5482
查看次数

LuaJIT和岩石?

只是来自"Lua新手"的一个小问题...我一直在使用LuaJIT,它很棒,没有问题是因为LuaJIT是Lua 5.1兼容这意味着我可以使用标准Lua在LuaJIT中使用的所有"LuaRocks" ?

例如,如果我想安装一个SQLite库(例如http://luaforge.net/projects/luasqlite/) - 我将如何在LuaJIT中安装它?

所有可用的"LuaRocks"是否与LuaJIT一起开箱即用?

lua luajit luarocks

6
推荐指数
1
解决办法
2050
查看次数

Lua脚本调用C共享库的最佳方法是什么?

我来自更多的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函数"......我只是希望我可以调用盒子上"标准"的共享库.

非常感谢帮助或建议;-)

谢谢

林顿

lua

5
推荐指数
1
解决办法
1985
查看次数

如何使用 EXECL 从 C 代码执行 Python 脚本?

我想知道如何使用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)

c

4
推荐指数
1
解决办法
3608
查看次数

LuaJIT和FFI:如何正确使用char *?

我已经看过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)

上面的代码不起作用...好吧,我认为在上面的最后一行代码之前,它都起作用。

有人可以给我一些建议,告诉我如何调用此“小写”功能并正确打印出结果吗?

lua

4
推荐指数
1
解决办法
3199
查看次数

如何使用 -bloadmap 或 -bnoquiet 选项?

我在 AIX 6.1 上的 C 编译期间收到有关重复符号的警告,它说:

ld: 0711-345 使用 -bloadmap 或 -bnoquiet 选项获取更多信息。

我在谷歌上查过如何使用这些但还没有明确的答案,有人可以告诉我我需要做什么才能使用 -bloadmap 或 -bnoquiet?

谢谢您的帮助 ;-)

林顿

c xlc

4
推荐指数
1
解决办法
4868
查看次数

如果子进程变成僵尸或崩溃,父进程可能会挂在“等待”步骤吗?

我已经使用 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 处理程序是最佳实践吗?

谢谢您的帮助

林顿

c

3
推荐指数
1
解决办法
2187
查看次数

进程的PID的最大可能长度是多少?(64位)

我一直在研究AIX,看到一些正在运行的进程ID长8。

我正在使用PID作为另一个char *值的串联,并且如果您从“ char角度”看,试图计算出PID的最大可能长度是多少?

我看过pid_t结构(例如t.html“> http://dvbstreamer.sourceforge.net/api/structPID_t.html),它的PID为INT ...

关于这一点,我假设PID是一个“有符号的整数” ....在这种情况下,有符号的整数的最大长度是多少?

谢谢您的帮助

林顿

c

3
推荐指数
1
解决办法
9251
查看次数

Lua中的"C like struct"用于LONG BUFFER操纵?

我想在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字节...

lua

3
推荐指数
1
解决办法
2615
查看次数

标签 统计

c ×6

lua ×4

aix ×1

gcc ×1

luajit ×1

luarocks ×1

pthreads ×1

signals ×1

unix ×1

xlc ×1