'Linux API'에 해당되는 글 135건

  1. 2019.06.24 fopen64
  2. 2019.05.27 ubuntu iio rotate key 찾기 또 실패
  3. 2019.05.24 리눅스 UDP 소켓
  4. 2019.05.24 리눅스 TCP 소켓
  5. 2019.05.16 linux udp cpp example
  6. 2019.01.03 libescp
  7. 2018.12.20 cups api
  8. 2018.10.22 system wait stdout
  9. 2018.04.23 전원버튼 IRQ 발생 관련
  10. 2018.04.17 linux kernel governor 관련 코드
Linux API/linux2019. 6. 24. 13:55

이걸 써야 하는지 안써도 되는데

그게 아니라면 -D_LARGEFILE_SOURCE 만 켜주면 되는건가?

 

[링크 : https://resetme.tistory.com/43]

[링크 : https://kldp.org/node/479]

[링크 : https://www.mkssoftware.com/docs/man3/fopen.3.asp]

 

[링크 : https://stackoverflow.com/.../what-is-the-difference-between-largefile-source-and-file-offset-bits-64]

Posted by 구차니
Linux API/linux2019. 5. 27. 19:09

xrandr을 이용해서 하거나 iio 관련해서 찾아보는데

어떠한 데몬이 어떤 키값을 통해서 작동을 하는지 감이 안온다.

 

/lib/udev/hwdb.d/60-keyboard.hwdb

 

키값을 읽어오는 명령어인데 회전 키를 누르면 두개가 뜬다. 도대체 어떤 키지?

$ sudo showkey -s
kb mode was ?UNKNOWN?
[ if you are trying this under X, it might not work
since the X server is also reading /dev/console ]

press any key (program terminates 10s after last keypress)...

0x6b 0xeb 
0x6b 0xeb 
0x6b 0xeb 

[링크 : https://unix.stackexchange.com/questions/49650/how-to-get-keycodes-for-xmodmap]

'Linux API > linux' 카테고리의 다른 글

open() read() write() close()를 이용한 cp 예제  (0) 2020.09.28
fopen64  (0) 2019.06.24
전원버튼 IRQ 발생 관련  (0) 2018.04.23
linux kernel governor 관련 코드  (0) 2018.04.17
linux shared memory 관련  (0) 2016.12.22
Posted by 구차니
Linux API/network2019. 5. 24. 14:11

sento() 에 인자를 좀 바꾸어서 명령어줄 인자를 받으면 재미있긴 한데..

TCP 처럼 클라이언트 별로 accept 해주는 구조가 아니라

개별 클라이언트를 어떻게 구분해야 하지? 라고 고민중

 

server

// Server side implementation of UDP client-server model
#include 
#include 
#include 
#include 
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>

#define PORT     8080
#define MAXLINE 1024

// Driver code
int main() {
        int sockfd;
        char buffer[MAXLINE];
        char *hello = "Hello from server";
        struct sockaddr_in servaddr, cliaddr;

        // Creating socket file descriptor
        if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) {
                perror("socket creation failed");
                exit(EXIT_FAILURE);
        }

        memset(&servaddr, 0, sizeof(servaddr));
        memset(&cliaddr, 0, sizeof(cliaddr));

        // Filling server information
        servaddr.sin_family = AF_INET; // IPv4
        servaddr.sin_addr.s_addr = INADDR_ANY;
        servaddr.sin_port = htons(PORT);

        // Bind the socket with the server address
        if ( bind(sockfd, (const struct sockaddr *)&servaddr,
                        sizeof(servaddr)) < 0 )
        {
                perror("bind failed");
                exit(EXIT_FAILURE);
        }

        while(1)
        {
        int len, n;
        n = recvfrom(sockfd, (char *)buffer, MAXLINE,
                                MSG_WAITALL, ( struct sockaddr *) &cliaddr,
                                &len);
        buffer[n] = '\0';
        printf("Client : %s\n", buffer);
//      sendto(sockfd, (const char *)hello, strlen(hello),
        sendto(sockfd, (const char *)buffer, strlen(buffer),
                MSG_CONFIRM, (const struct sockaddr *) &cliaddr,
                        len);
        printf("Hello message sent.\n");
        }
        return 0;
}

 

client

// Client side implementation of UDP client-server model
#include 
#include 
#include 
#include 
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>

#define PORT     8080
#define MAXLINE 1024

// Driver code
int main(int argc, char **argv) {
        int sockfd;
        char buffer[MAXLINE];
        char *hello = "Hello from client";
        struct sockaddr_in       servaddr;

        // Creating socket file descriptor
        if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) {
                perror("socket creation failed");
                exit(EXIT_FAILURE);
        }

        memset(&servaddr, 0, sizeof(servaddr));

        // Filling server information
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(PORT);
        servaddr.sin_addr.s_addr = INADDR_ANY;

        int n, len;

//      sendto(sockfd, (const char *)hello, strlen(hello),
        sendto(sockfd, (const char *)argv[1], strlen(argv[1]),
                MSG_CONFIRM, (const struct sockaddr *) &servaddr,
                        sizeof(servaddr));
        printf("Hello message sent.\n");

        n = recvfrom(sockfd, (char *)buffer, MAXLINE,
                                MSG_WAITALL, (struct sockaddr *) &servaddr,
                                &len);
        buffer[n] = '\0';
        printf("Server : %s\n", buffer);

        close(sockfd);
        return 0;
}

 

[링크 : https://www.geeksforgeeks.org/udp-server-client-implementation-c/]

[링크 : https://www.geeksforgeeks.org/tcp-and-udp-server-using-select/]

 

+

[링크 : https://scrapsquare.com/notes/udp-length]

[링크 : https://en.wikipedia.org/wiki/User_Datagram_Protocol]

 

+

class (cpp) 기반 UDP socket 예제

[링크 : http://youngmok.com/udp-server-c-class-listening-thread/]

'Linux API > network' 카테고리의 다른 글

UDS (Unix Domain Socket)  (0) 2020.09.01
raw socker과 promiscous mode  (0) 2019.07.03
리눅스 TCP 소켓  (0) 2019.05.24
linux udp cpp example  (0) 2019.05.16
linux socket 관련  (0) 2015.01.22
Posted by 구차니
Linux API/network2019. 5. 24. 11:01

개념만 알지 써보진 않은 녀석이라.. 후 공부 해야겠네 ㅠㅠ

역시 공부는 돈받고 해야 제맛

 

테스트 삼아 SOCK_STREAM을 SOCK_DGRAM 으로 바꾸었는데

accept 하는 부분이 달라져야 하는지 정상작동을 하진 않는다.

(댓글들 보면 메모리 누수라던가 여러가지 문제가 넘치는 소스인듯)

그래도 서버 하나 실행하고 클라이언트 여러개 실행해도 각각 응답이 다르게 오는것 봐서는

내가 의도하는 그런 정상적인(!) 서버로 구동되는 건 맞는 듯 하니 일단 패스

 

server

/*
        C socket server example, handles multiple clients using threads
*/

#include
#include      //strlen
#include      //strlen
#include<sys/socket.h>
#include<arpa/inet.h>   //inet_addr
#include      //write
#include //for threading , link with lpthread

//the thread function
void *connection_handler(void *);

int main(int argc , char *argv[])
{
        int socket_desc , client_sock , c , *new_sock;
        struct sockaddr_in server , client;

        //Create socket
        socket_desc = socket(AF_INET , SOCK_STREAM , 0);
        if (socket_desc == -1)
        {
                printf("Could not create socket");
        }
        puts("Socket created");

        //Prepare the sockaddr_in structure
        server.sin_family = AF_INET;
        server.sin_addr.s_addr = INADDR_ANY;
        server.sin_port = htons( 8888 );

        //Bind
        if( bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0)
        {
                //print the error message
                perror("bind failed. Error");
                return 1;
        }
        puts("bind done");

        //Listen
        listen(socket_desc , 3);

        //Accept and incoming connection
        puts("Waiting for incoming connections...");
        c = sizeof(struct sockaddr_in);


        //Accept and incoming connection
        puts("Waiting for incoming connections...");
        c = sizeof(struct sockaddr_in);
        while( (client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c)) )
        {
                puts("Connection accepted");

                pthread_t sniffer_thread;
                new_sock = malloc(1);
                *new_sock = client_sock;

                if( pthread_create( &sniffer_thread , NULL ,  connection_handler , (void*) new_sock) < 0)
                {
                        perror("could not create thread");
                        return 1;
                }

                //Now join the thread , so that we dont terminate before the thread
                //pthread_join( sniffer_thread , NULL);
                puts("Handler assigned");
        }

        if (client_sock < 0)
        {
                perror("accept failed");
                return 1;
        }

        return 0;
}

/*
 * This will handle connection for each client
 * */
void *connection_handler(void *socket_desc)
{
        //Get the socket descriptor
        int sock = *(int*)socket_desc;
        int read_size;
        char *message , client_message[2000];

        //Send some messages to the client
        message = "Greetings! I am your connection handler\n";
        write(sock , message , strlen(message));

        message = "Now type something and i shall repeat what you type \n";
        write(sock , message , strlen(message));

        //Receive a message from client
        while( (read_size = recv(sock , client_message , 2000 , 0)) > 0 )
        {
                //Send the message back to client
                write(sock , client_message , strlen(client_message));
        }

        if(read_size == 0)
        {
                puts("Client disconnected");
                fflush(stdout);
        }
        else if(read_size == -1)
        {
                perror("recv failed");
        }

        //Free the socket pointer
        free(socket_desc);

        return 0;
}

client

/*
        C ECHO client example using sockets
*/
#include       //printf
#include      //strlen
#include<sys/socket.h>  //socket
#include<arpa/inet.h>   //inet_addr
#include 

int main(int argc , char *argv[])
{
        int sock;
        struct sockaddr_in server;
        char message[1000] , server_reply[2000];

        //Create socket
        sock = socket(AF_INET , SOCK_STREAM , 0);
        if (sock == -1)
        {
                printf("Could not create socket");
        }
        puts("Socket created");

        server.sin_addr.s_addr = inet_addr("127.0.0.1");
        server.sin_family = AF_INET;
        server.sin_port = htons( 8888 );

        //Connect to remote server
        if (connect(sock , (struct sockaddr *)&server , sizeof(server)) < 0)
        {
                perror("connect failed. Error");
                return 1;
        }

        puts("Connected\n");

        //keep communicating with server
        while(1)
        {
                printf("Enter message : ");
                scanf("%s" , message);

                //Send some data
                if( send(sock , message , strlen(message) , 0) < 0)
                {
                        puts("Send failed");
                        return 1;
                }

                //Receive a reply from the server
                if( recv(sock , server_reply , 2000 , 0) < 0)
                {
                        puts("recv failed");
                        break;
                }

                puts("Server reply :");
                puts(server_reply);
        }

        close(sock);
        return 0;
}

[링크 : https://www.geeksforgeeks.org/...-handling-multiple-clients-on-server-without-multi-threading/]

[링크 : https://stackoverflow.com/questions/31461492/client-server-multiple-connections-in-c]

 

1. Create socket
2. Bind to address and port
3. Put in listening mode
4. Accept connections and process there after.

[링크 : https://www.binarytides.com/server-client-example-c-sockets-linux/]

 

 

+

man page 보는데 특이하게 2번과 3번으로 두개가 있네?

설명 자체는 둘이 좀 달라서 어느게 어떤 차이가 있는지 좀 애매하다.

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

#define _GNU_SOURCE
            /* See feature_test_macros(7) */

#include <sys/socket.h>

int accept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags);

[링크 : https://linux.die.net/man/2/accept]

 

#include <sys/socket.h>

int accept(int socket, struct sockaddr *restrict address, socklen_t *restrict address_len);

[링크 : https://linux.die.net/man/3/accept]

 

 

'Linux API > network' 카테고리의 다른 글

raw socker과 promiscous mode  (0) 2019.07.03
리눅스 UDP 소켓  (0) 2019.05.24
linux udp cpp example  (0) 2019.05.16
linux socket 관련  (0) 2015.01.22
멀티캐스트 되는지 여부 확인  (0) 2014.11.21
Posted by 구차니
Linux API/network2019. 5. 16. 18:48

 

 

[링크 : http://www.linuxhowtos.org/C_C++/socket.htm] c

[링크 : https://linux.m2osw.com/c-implementation-udp-clientserver] cpp

 

 

[링크 : ]

'Linux API > network' 카테고리의 다른 글

리눅스 UDP 소켓  (0) 2019.05.24
리눅스 TCP 소켓  (0) 2019.05.24
linux socket 관련  (0) 2015.01.22
멀티캐스트 되는지 여부 확인  (0) 2014.11.21
net tools 소스코드  (0) 2011.11.07
Posted by 구차니
Linux API2019. 1. 3. 19:31

엡슨 프린트용 라이브러리.

회사가 폐업을 했나.. 아니면 비공개로 돌렸나 자료가 잘안나오네..


[링크 : https://www.howtoinstall.co/en/debian/wheezy/libescpr-dev]

[링크 : https://www.howtoinstall.co/en/debian/wheezy/libescpr1]

'Linux API' 카테고리의 다른 글

kms - Kernel Mode Setting  (0) 2022.07.14
syslog c api(?)  (0) 2021.02.17
cups api  (0) 2018.12.20
system wait stdout  (0) 2018.10.22
ncurse  (0) 2015.04.27
Posted by 구차니
Linux API2018. 12. 20. 13:06

lp나 lpr 명령어의 소스코드를 보면 좋을텐데 어디서 구할 수 있으려나?

그나저나.. cups 외에는 프린터 관련 api가 없는건가?


원본링크 깨져서..

[링크 : https://wiki.linuxfoundation.org/images/1/15/Lexington06-cups-api.pdf] 구글 웹캐시

[링크 : https://refspecs.linuxfoundation.org/LSB_3.2.0/LSB-Printing/LSB-Printing/libcupsman.html]

[링크 : http://janaxelson.com/code/printer.c]


+

lpr.c로 검색하니 하나 나오긴 하네.. 얘도 cups api를 쓴 듯?

[링크 : https://opensource.apple.com/source/cups/cups-86/berkeley/lpr.c.auto.html]


+

[링크 : https://github.com/apple/cups]

'Linux API' 카테고리의 다른 글

syslog c api(?)  (0) 2021.02.17
libescp  (0) 2019.01.03
system wait stdout  (0) 2018.10.22
ncurse  (0) 2015.04.27
lirc - linux IR Remote control  (0) 2015.03.31
Posted by 구차니
Linux API2018. 10. 22. 14:52

[링크 : https://linux.die.net/man/3/system]

[링크 : https://linux.die.net/man/2/wait]


+

system으로는 실행 내용을 돌릴수 없으므로 ppipe 이용

[링크 : http://wanochoi.com/?p=178]


+

POST 인자로 body에 id와 password를 넘겨주는 curl을 실행하는 예제

#include <stdio.h>

#include <stdlib.h>


void main()

{

        int ret = 0;

        int status = 0;


        unsigned char cmd[255];

        unsigned char id[32] = "admin";

        unsigned char pw[32] = "admin";

        unsigned char url[] = "http://localhost:3000/api/test";

        unsigned char header[] = "-H 'Content-Type: application/json'";

        unsigned char data = "-d '{ \"id\":\"%s\",\"password\":\"%s\"}'";

        sprintf(cmd, "curl -X POST %s %s -d '{ \"id\":\"%s\",\"password\":\"%s\"}'",

                url, header, id, pw);

        printf("%s\n",cmd);


//      ret = system(cmd);

//      wait(&status);


        FILE *output = popen(cmd, "r");

        char buf[255];

        int pos = 0;

        while( !feof(output) && !ferror(output) )

        {

                int bytesRead = fread( buf + pos , 1, 128, output );

                pos += bytesRead;

        }


        printf("buf : [%s]\n",buf);


//      printf("ret : [%d]\n",ret);

//      printf("sta : [%d]\n",WEXITSTATUS(status));


+

이상한 메시지는 curl 을 콘솔에서 실행할때에도 안나오는데 아무튼. pipe로 실행하면 넘겨져 온다. 

보기 싫으면 --silent 옵션주면 끝

# ./a.out

curl -X POST http://localhost:3000/api/test -H 'Content-Type: application/json' -d '{ "id":"1234","password":"1234"}'

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

                                 Dload  Upload   Total   Spent    Left  Speed

100   397  100   363  100    34  18426   1725 --:--:-- --:--:-- --:--:-- 19105 

[링크 : https://makandracards.com/makandra/1615-disable-output-when-using-curl[

'Linux API' 카테고리의 다른 글

libescp  (0) 2019.01.03
cups api  (0) 2018.12.20
ncurse  (0) 2015.04.27
lirc - linux IR Remote control  (0) 2015.03.31
vaapi vdpau uvd  (6) 2015.03.26
Posted by 구차니
Linux API/linux2018. 4. 23. 13:46

잘은 모르겠지만.. PC에서 쓰이는 PWRBTN  같은 전원관련 스위치들은

PMIC를 통해 인터럽트를 발생시킨다고 하는데..

GPIO를 통한 인터럽트인지 I2C(혹은 SMBUS)를 통해 통보받은걸 인터럽트로 넘겨주는건진 모르겠다.


2.7.15 Power Control Signals

i.MX6 Qseven PMIC SOM supports two power control signals PWGIN and PWRBTN# on Qseven Edge connector.

PWGIN input from Qseven Edge connector is the active high signal which is used to enable the power of i.MX6

Qseven PMIC SOM. For more details on PWRGIN signal usage, refer section 3.1.2.

i.MX6 Qseven PMIC SOM supports PWRBTN# input from Qseven Edge connector which is the active low signal and

connected to i.MX6 CPU’s ONOFF pin. This pin can be used to On/Off the i.MX6 CPU by connecting push button in

the carrier board. When the board power is On, a button press between 750ms to 5s will send an interrupt to core to

request software to bring down the i.MX6 safely (if software supports). Otherwise, button press greater than 5s

results in a direct hardware power down which is applicable when software is unable to power Off the device. When

the i.MX6 CPU power supply is Off, a button press greater in duration than 750ms asserts an output signal to request

power from a power IC to power up the i.MX6 CPU. 

[링크 : http://www1.futureelectronics.com/doc/IWAVE%20SYSTEMS%20TECHNOLOGIES/G15MDataSheet.pdf]


 +static irqreturn_t pb_isr(int irq, void *dev_id)

+{

+ int ret;

+ int state;

+

+ ret = intel_soc_pmic_readb(DC_TI_SIRQ_REG);

+ if (ret < 0) {

+ pr_err("[%s] power button SIRQ REG read fail %d\n",

+ pb_input->name, ret);

+ return IRQ_NONE;

+ }

+

+ state = ret & SIRQ_PWRBTN_REL;

+

+ if (force_trigger && state) {

+ /* If we lost the press interrupt when short pressing

+ * power button to wake up board from S3, simulate one.

+ */

+ input_event(pb_input, EV_KEY, KEY_POWER, 1);

+ input_sync(pb_input);

+ input_event(pb_input, EV_KEY, KEY_POWER, 0);

+ input_sync(pb_input);

+ } else {

+ input_event(pb_input, EV_KEY, KEY_POWER, !state);

+ input_sync(pb_input);

+ pr_info("[%s] power button %s\n", pb_input->name,

+ state ? "released" : "pressed");

+ }

+

+ if (force_trigger)

+ force_trigger = 0;

+

+ return IRQ_HANDLED;

+}

+

+static int pb_probe(struct platform_device *pdev)

+{

+ int ret;

+

+ pwrbtn_irq = platform_get_irq(pdev, 0);

+ if (pwrbtn_irq < 0) {

+ dev_err(&pdev->dev,

+ "get irq fail: irq1:%d\n", pwrbtn_irq);

+ return -EINVAL;

+ }

+ pb_input = input_allocate_device();

+ if (!pb_input) {

+ dev_err(&pdev->dev, "failed to allocate input device\n");

+ return -ENOMEM;

+ }

+ pb_input->name = pdev->name;

+ pb_input->phys = "power-button/input0";

+ pb_input->id.bustype = BUS_HOST;

+ pb_input->dev.parent = &pdev->dev;

+ input_set_capability(pb_input, EV_KEY, KEY_POWER);

+ ret = input_register_device(pb_input);

+ if (ret) {

+ dev_err(&pdev->dev,

+ "failed to register input device:%d\n", ret);

+ input_free_device(pb_input);

+ return ret;

+ }

+

+ ret = request_threaded_irq(pwrbtn_irq, NULL, pb_isr,

+ IRQF_NO_SUSPEND, DRIVER_NAME, pdev);

+ if (ret) {

+ dev_err(&pdev->dev,

+ "[request irq fail0]irq:%d err:%d\n", pwrbtn_irq, ret);

+ input_unregister_device(pb_input);

+ return ret;

+ }

+

+ return 0;

+}

[링크 : https://github.com/.../uefi/cht-m1stable/patches/PWRBTN-add-driver-for-TI-PMIC.patch]


> +int intel_soc_pmic_set_pdata(const char *name, void *data, int len)

> +{

> + struct cell_dev_pdata *pdata;

> +

> + pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);

> + if (!pdata) {

> + pr_err("intel_pmic: can't set pdata!\n");

> + return -ENOMEM;

> + }

> +

> + pdata->name = name;

> + pdata->data = data;

> + pdata->len = len;

> +

> + list_add_tail(&pdata->list, &pdata_list);

> +

> + return 0;

> +}

> +EXPORT_SYMBOL(intel_soc_pmic_set_pdata); 

[링크 : https://patchwork.kernel.org/patch/4227571/]



+

근데... 정기적으로 읽긴 그런 애매한 녀석이고..

이걸 인터럽트로 어떻게 던지지?



[링크 : https://www.intel.com/.../datasheets/7-series-chipset-pch-datasheet.pdf]

'Linux API > linux' 카테고리의 다른 글

fopen64  (0) 2019.06.24
ubuntu iio rotate key 찾기 또 실패  (0) 2019.05.27
linux kernel governor 관련 코드  (0) 2018.04.17
linux shared memory 관련  (0) 2016.12.22
linux ipc  (0) 2016.12.20
Posted by 구차니
Linux API/linux2018. 4. 17. 14:39

odroid에서 가버너 정책에 따라 cpu 갯수와 속도가 달라져서

어떤식으로 구현되는지 한번 찾아보는 중


해당 내용은 linux kernel 의 device driver 부분에 구현되어있다.(drivers/cpufreq/) 


## drivers/cpufreq/cpufreq_hotplug.c

해당 파일은 크게 두부분으로 나뉘어있다. sysfs 를 구성하는 파일에 대한 내용을 구현한 부분과 governor 의 hotplug 정책에 맞게 cpu load를 계산해서 cpu 를 끄고 켜는 부분이다. 

[링크 : http://pinocc.tistory.com/47]

[링크 : https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt]

[링크 : http://blog.dasomoli.org/472/] 위에꺼 번역?


[링크 : http://com.odroid.com/sigong/nf_board/nboard_view.php?brd_id=odroidc2&bid=7596]


+

cpu_up()

cpu_disable()


[링크 : https://android.googlesource.com/.../android-mediatek-sprout-3.4-kitkat-mr2/drivers/cpufreq]

[링크 : https://www.kernel.org/doc/html/v4.13/core-api/cpu_hotplug.html]

[링크 : https://www.kernel.org/doc/ols/2004/ols2004v2-pages-181-194.pdf]



+

[링크 : https://github.com/hardkernel/linux/blob/odroid-3.8.y/drivers/cpufreq/exynos4x12-cpufreq.c]

[링크 : https://github.com/hardkernel/linux/blob/odroid-3.8.y/drivers/cpufreq/exynos4x12-dvfs-hotplug.c]

'Linux API > linux' 카테고리의 다른 글

ubuntu iio rotate key 찾기 또 실패  (0) 2019.05.27
전원버튼 IRQ 발생 관련  (0) 2018.04.23
linux shared memory 관련  (0) 2016.12.22
linux ipc  (0) 2016.12.20
pthread detach while  (0) 2016.12.20
Posted by 구차니