Seems this title is also dangerous, aha, this is a long story, some time ago, I want to implement a timer logic(when timer trigger, run some logic), but I don’t want to create a new thread, so I remember the signal, and then someone warning me maybe it’s not safe. I don’t know why, he only told me that it’s not recommend.
Ok, this is a question around my mind for a long time, I want to know why, but most of all articles couldn’t explain the reason clearly. I need to figure it out by myself. So this is why I write this blog.
Some days ago, I took some time to read this article, and I got some conclusions which can explain my questions:
- Signal handler need as simple as possible, don’t use non-reentry function in it. for example the fprintf api may involve in this issue.
- Signal handler also will break lock, because it doesn’t care which part was locked. So this may cause dead lock.
- Signal may merged by kernel, so we can’t use signal to do some statistic.
Ok, I just listed some major points, so we can use the signal to do some simple purpose, write the simple logic in it. That will be safe, for example, we only update a flag in signal handler.
Ok, all above, I just described the origin signal usage, for now, we have the signalfd api to create a fd which can poll for monitoring, but you need to investigate whether you can add this fd to your polling list, because this part may inside in your framework which you can’t control it. This method can solve the 1 and 2 issues above.
Have a fun.
This release include big enhancement and several new features [bump here]:
Issue #7: rename list to ls
Issue #6: before add/edit/rm, create a index.bak first, and can revert to last version by a new command -> revert
Issue #3: add -p option for ls and find command, which can show all content of the line without limitation
Issue #8: add show command for showing all tags info
Issue #2: add multi tags support
fix compatible issue, using bash instead of sh
using getopts instead of manually get args
Have a fun
I dont know whether you encounter these issue:
- Many snippets in anywhere, sometimes you can’t find it when you want to use that
- A large size of text hold all kinds of snippets, you can’t find what you want quickly
- When you want to run a command in your note, you need to copy first, then switch window, then paste it into terminal. if you using mac, maybe you also need to switch desktop to find which window you need to paste.
- Sometimes, you want to sync your notes to other place or share your note to others or want to take a look at others’ notes/snippets, you reach that hardly.
Ok, stop to list, if you encounter them and want to make a change, just follow me. –> I share you a new tool which almost can resolve these issues –> magicnote
If you want to try that, follow the README
, install and try it. The command is easy:
\_ magicnote addsource source
\_ magicnote list [tag1 [ tag2 ...]]
\_ magicnote add [-tag tagname]
\_ magicnote rm tag@index [tag2@index2 ...]
\_ magicnote edit tag@index [tag2@index2 ...]
\_ magicnote find tag1 tag2 ...
\_ magicnote run tag@index [tag2@index2 ...]
\_ magicnote gc
bash~$ magicnote list
|- @1 : # ipv6
|- #1: ping6 -I eth0 fe80::250:56ff:fe1d:66c0
|- #2: ping6 -I eth0 ff02::1
|- #3: telnet fe80::250:56ff:fe1d:66c0%eth0 8080
The powerful run command:
bash~$ magicnote run ping@1
ready to run:
PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.043 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.093 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.044 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.126 ms
--- 127.0.0.1 ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.043/0.076/0.126/0.035 ms
This tool is a newbie, so it may contain some bugs, or issues, just free to open a issue on github, I’ll try my best to fix/improve that, or you can send a pull request for me, that will be better.
So, in the end, have a fun
aha, I’m very excited to tell everybody, my new project named “httpd_mock” was born last night. Ok, let me give you a short brief:
It’s a mock service for performance testing, debugging or something else, it support 3 types of response:
- specific length response
- chunked response
- mix type ( contain two types above )
How to Run:
- make install
- cd bin && ./httpd_mock -c ../etc/httpd_mock.cfg
It’s a light and high performance service, one process takes 50% cpu can supply 50K+ QPS with 100-150ms avg latency.
btw, if you want to change its mode, change the configuration file, have a fun~
Okie, for this question, I remember that a interviewer has asked me before, unfortunately I didn’t know how to answer this question at that time. But the answer he gave me is not very correct when I know the truth.
First, let’s go through the truth: There is no explicit maximum count for the number of mutex objects which may exist simultaneously within an application or on a system in general. Considering this and the fact that mutexes are not required to be created at the kernel level and kernel specific resources are not consumed, most systems are normally limited only by the amount of memory available.
So, it is limited by memory, but not kernel, if there is no enough available memory for us, we can not alloc a new lock. For some hash table structure, if we want to avoid concurrent, we can alloc a lock per key if there is still enough memory available. But lock is still cost memory, if the concurrent is not very high, or the memory is very limit for us, we need to attend it. For this solution, we can alloc limited locks at start, so the collision probability is “hash(key) / locks”, in the best situation, there is no collision occur, the worst situation, all keys will be blocked by one lock, this need to analysis by online data.
Hope this will be a little bit help. :D