^ : 해당 커밋의 부모
^2 : 두번쨰 부모 (즉 부모가 두가지로 나눠져 있을 떄)
~: 해당 커밋의 부모
~2 : 해당 커밋의 부모의 부모
HEAD^^ = HEAD~2
^2 : 두번쨰 부모 (즉 부모가 두가지로 나눠져 있을 떄)
~: 해당 커밋의 부모
~2 : 해당 커밋의 부모의 부모
HEAD^^ = HEAD~2
$ps -ef | grep udevd 검색되는게 없다면 데몬이 돌지 않는 것이다.which udevd 또는 find / -name "udevd"로 설치되어 있는지 확인 한다.etc/udev/rules.d/ 폴더에 있는 rules 스크립트를 차례로 실행 하게 되는데 해당 폴더에 스크립트를 작성한다. 여기서는 샘플로 파일명을 10-local.rules로 생성한다.udevd --daemon --debug로 실행 해보면 만약 rules.d 경로가 틀리면 error 메세지가 출력되며 폴더 경로가 어디인지 확인 할 수 있다.
아래와 같이 스크립트를 작성 한다.스크립트 작성방법은 여러가지가 있다.
ACTION=="add",KERNEL=="sd??",SUBSYSTEM=="block", RUN+="/usr/local/sbin/usbmount.sh 1 %k"
ACTION=="remove",KERNEL=="sd??",SUBSYSTEM=="block", RUN+="/usr/local/sbin/cstusbmount.sh 2 %k"
#ACTION=="remove",ENV{DEVNAME}=="/dev/sd[a-z][0-9]",SUBSYSTEM=="block",RUN+="/usr/local/etc/udev/rules.d/cstusbmount.sh 2 %k
%k는 $KERNEL 과 같다. 보다 자세한 정보를 원한다면 udev rules를 이용 한다. #!/bin/sh
case $1 in
1)
#echo $2 >> /etc/udev/rules.d/add.txt
mkdir -p /mnt/usb/$2
mount /dev/$2 /mnt/usb/$2
;;
2)
#!/bin/sh
#echo $2 > /etc/udev/rules.d/remove.txt
umount /mnt/usb/$2
rmdir /mnt/usb/$2
단순히 rules 동작만 확인 하고 싶다면 RUN에 주석을 제거 하고 확인 해본다.
udevd --daemon 추가std::for_each
template <class InputIterator, class Function>
Function for_each (InputIterator first, InputIterator last, Function fn);
* @param __first An input iterator.
* @param __last An input iterator.
* @param __f A unary function object.
// for_each example
#include <iostream> // std::cout
#include <algorithm> // std::for_each
#include <vector> // std::vector
void myfunction (int i) { // function:
std::cout << ' ' << i;
}
struct myclass { // function object type:
void operator() (int i) {std::cout << ' ' << i;}
} myobject;
int main () {
std::vector<int> myvector;
myvector.push_back(10);
myvector.push_back(20);
myvector.push_back(30);
std::cout << "myvector contains:";
for_each (myvector.begin(), myvector.end(), myfunction);
std::cout << '\n';
// or:
std::cout << "myvector contains:";
for_each (myvector.begin(), myvector.end(), myobject);
std::cout << '\n';
return 0;
}
myvector contains: 10 20 30
myvector contains: 10 20 30
struct myclass { //unary function object type:
void operator() (int i) {std::cout << ' ' << i;}
} myobject;
std::find_if
template <class InputIterator, class UnaryPredicate>
InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred);
* @param __first An input iterator.
* @param __last An input iterator.
* @param __pred A predicate.
// find_if example
#include <iostream> // std::cout
#include <algorithm> // std::find_if
#include <vector> // std::vector
struct myclass { // unary predicate
bool operator() (int i) {return ((i%2)==1);}
} myobject;
int main () {
std::vector<int> myvector;
myvector.push_back(10);
myvector.push_back(25);
myvector.push_back(40);
myvector.push_back(55);
std::vector<int>::iterator it = std::find_if (myvector.begin(), myvector.end(), myobject);
std::cout << "The first odd value is " << *it << '\n';
return 0;
}
The first odd value is 25
struct myclass { // unary predicate
bool operator() (int i) {return ((i%2)==1);}
} myobject;
0번지 부터 메모리가 사용되므로 (0x7FF - 0x0) + 1 = 0x800
대부분의 메모리 용량은 2진수로 변환 했을 때 1인 값이 하나밖에 없는 경우가 많다.
0x800 -> b100 0000 0000 (2^11 = 2kbyte)
$ sudo dpkg --add-architecture i386 && sudo apt-get update$ sudo dpkg --remove-architecture i386 && sudo apt-get update$apt-get install libc6:i386 libstdc++6:i386 libncurses5:i386 zlib1g:i386