‘壹’ linux下,在调用main函数之前怎样得到命令行参数argc和argv
#include <mutex>
#include <thread>
class main_args;
namespace details
{
template<typename MainArgs>
class main_args_access : MainArgs
{
public:
static void get_main_args_func(int c, char* v[], char* p[])
{
std::call_once(MainArgs::get_flag, [&](){
MainArgs::argc = c;
MainArgs::argv = v;
MainArgs::envp = p;
});
}
};
}
class main_args
{
private:
friend class details::main_args_access<main_args>;
static std::once_flag get_flag;
public:
static int argc;
static char** argv;
static char** envp;
};
int main_args::argc;
char** main_args::argv = nullptr;
char** main_args::envp = nullptr;
namespace details
{
// gcc
#if defined(__GNUC__) && (__linux__)
__attribute__((section(".init_array"))) void (*get_main_args_func_ptr)(int, char*[], char*[]) = &(main_args_access<main_args>::get_main_args_func);
#endif
}
必需支持C++11以上的编译器
‘贰’ 在linux c编程里看到一句代码:kill(func(), SIGHUP);func()是子函数,请问这句是什么意思
func()函数返回一个进程ID,SIGHUP是signal信号中的一种处理方式,系统对SIGHUP信号的默认处理是终止收到该信号的进程。所以若程序中没有捕捉该信号,当收到该信号时,进程就会退出。
‘叁’ linux :() { :|:& }; : 什么意思
挺古老的的一个蛋疼小程序了【以前我觉着机器好,就手贱地运行了,于是不出意外地死机了】
原理就是定义一个函数,并不断递归,不停地制造后台任务。如你所见那个函数名就是个冒号,其实这完全就是在扰乱你的视线。【话说回来好像bash里好像也有一个啥事都不干的冒号命令】
写的易懂点:
func () { #函数定义,这里把函数名改成了func
func | func & #管道符连接的命令貌似会同时开始【也有可能是倒序开始来IO阻塞,我对bash研究不深】,所以当下一个func被调用时,一个后台的func已经建立
}
func #那么开始滚雪球,准备好随时power键