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

  1. 2022.11.24 pthread 테스트
  2. 2022.11.23 pthread
  3. 2022.11.11 iio(industrial io) 문서
  4. 2022.10.26 mkpipe 와 poll
  5. 2022.10.20 ‘F_SETPIPE_SZ’ undeclared
  6. 2022.10.18 linux fifo
  7. 2022.10.17 SIGPIPE
  8. 2022.10.11 linux ipc 최대 데이터 길이
  9. 2022.09.21 ipc 성능 비교
  10. 2022.09.21 posix message queue
Linux API/linux2022. 11. 24. 10:23

심심(?)해서 pthread를 1회성으로 구동하고 죽게 냅두면 어떻게 되나 궁금해서 해봤는데

메모리 16GB 시스템에서 32753개 정도까지 밖에 구동 못하고 메모리를 할당할 수 없다고 죽는다.

user space 메모리는 문제가 없는 것 같은데 커널 메모리를 다 먹어 버린건가?

$ cat main.c
#include <stdio.h>
#include <pthread.h>

void *func(int *val)
{
        printf("hello %d\n", *val);
}

void main()
{
        pthread_t pt;
        int pid = 0;
        int i = 0;
        for(i = 0; i < 100000; i++)
        {
                pid = pthread_create(&pt, NULL, func, &i);
                if (pid > 0 )
                {
                        perror("thread create error");
                        exit(0);
                }
        }
}
$ gcc main.c -lpthread
$ ./a.out
hello 32753
thread create error: Cannot allocate memory
$ top
top - 10:16:37 up 8 days, 23:07,  3 users,  load average: 0.39, 0.24, 0.09
Tasks: 363 total,   3 running, 293 sleeping,   0 stopped,   0 zombie
%Cpu(s):  6.2 us, 25.0 sy,  0.0 ni, 66.2 id,  0.0 wa,  0.0 hi,  2.5 si,  0.0 st
KiB Mem : 16169232 total,   808336 free,  2131900 used, 13228996 buff/cache
KiB Swap:  2097148 total,  2095356 free,     1792 used. 13436824 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
25250 minimonk   20   0  0.107t 117784   1584 R 131.8  0.7   0:00.29 a.out
22599 minimonk   20   0  110440   6228   4996 R  81.8  0.0   0:17.60 sshd
21729 root      20   0       0      0      0 I   9.1  0.0   0:00.11 kworker/u16:3-e
22764 root      20   0       0      0      0 I   9.1  0.0   0:01.27 kworker/u16:2-e
17413 root      20   0       0      0      0 I   4.5  0.0   0:02.40 kworker/4:0-eve
18086 root      20   0       0      0      0 I   4.5  0.0   0:02.63 kworker/5:0-eve
21979 root      20   0       0      0      0 I   4.5  0.0   0:01.56 kworker/1:1-eve
22094 root      20   0       0      0      0 I   4.5  0.0   0:00.80 kworker/3:1-eve
22446 root      20   0       0      0      0 I   4.5  0.0   0:00.61 kworker/2:0-eve
27802 minimonk   20   0   45652   4232   3476 R   4.5  0.0   0:00.97 top

[링크 : https://www.joinc.co.kr/w/Site/system_programing/Book_LSP/ch07_Thread]

 

 

+

pthread_join()으로 쓰레드가 끝나길 기다리는데 안 끝난다.

return이 없어서인가.. 쓰레드도 종료를 하는 다른 함수가 있는건가?

 

+

다시 해보니 pthread_join에 포인터로 pthread_t 변수를 넘겨서 그랬던 듯. 잘 돈다.

#include <stdio.h>
#include <pthread.h>

void *func(int *val)
{
    printf("hello %d\n", *val);

//  return ((void*)0);
}

void main()
{
    pthread_t pt;
    int pid = 0;
    int i = 0;
    int status = 0;
    for(i = 0; i < 100000; i++)
    {
        pid = pthread_create(&pt, NULL, func, &i);
        if (pid > 0 )
        {
            perror("thread create error");
            exit(0);
        }
        pthread_join(pt, (void**)&status);
    }
}

[링크 : https://www.joinc.co.kr/w/Site/Thread/Advanced/ThreadCancle]

 

좀.. 비슷한 타입으로 하게 하라고 -_-

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
int pthread_join(pthread_t thread, void **retval);

 

+

pthread_join 안하니 다시 메모리 할당 오류. 쓰레드 에서 return 0 하는거랑은 상관없다.

#include <stdio.h>
#include <pthread.h>

void *func(int *val)
{
        printf("hello %d\n", *val);

//      return ((void*)0);
}

void main()
{
        pthread_t pt;
        int pid = 0;
        int i = 0;
        int status = 0;
        for(i = 0; i < 100000; i++)
        {
                pid = pthread_create(&pt, NULL, func, &i);
                if (pid > 0 )
                {
                        perror("thread create error");
                        exit(0);
                }
//              pthread_join(pt, (void**)&status);
        }
}

 

detach 하면 종료시 자동으로 자원 반납이 된다고 한다.

테스트 해보니 return도 필요없이 쓰레드에서 실행될 함수가 종료되면 그냥 종료된다.

랜덤하게 안되긴 한데, printf가 중첩되서 버퍼가 쌓이며 문제가 생기는거 같기도 하고? (쓰레드를 5만개 넘기는 시점이니)

기본적으로 스레드의 종료 코드는 스레드가 종료되더라도 pthread_join이 호출될 때까지 유지됩니다. 하지만, detatch 상태의 스레드는 종료되는 즉시 자원이 회수됩니다

[링크 : http://xucxo.blogspot.com/2011/03/linux-programming-thread.html]

 

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

system v shmget size  (0) 2023.01.09
segfault시 calltree 출력하기  (0) 2022.11.28
pthread  (0) 2022.11.23
iio(industrial io) 문서  (0) 2022.11.11
mkpipe 와 poll  (0) 2022.10.26
Posted by 구차니
Linux API/linux2022. 11. 23. 19:03

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

segfault시 calltree 출력하기  (0) 2022.11.28
pthread 테스트  (0) 2022.11.24
iio(industrial io) 문서  (0) 2022.11.11
mkpipe 와 poll  (0) 2022.10.26
‘F_SETPIPE_SZ’ undeclared  (0) 2022.10.20
Posted by 구차니
Linux API/linux2022. 11. 11. 16:40

내용상 같은 문서 같은데..

왜 kernel.org 문서는 눈에 잘 안들어 올까?

오히려 과도한(?) 서식이 문제인가

 

[링크 : https://www.kernel.org/doc/html/v4.11/driver-api/iio/index.html]

[링크 : https://dbaluta.github.io/index.html]

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

pthread 테스트  (0) 2022.11.24
pthread  (0) 2022.11.23
mkpipe 와 poll  (0) 2022.10.26
‘F_SETPIPE_SZ’ undeclared  (0) 2022.10.20
linux fifo  (0) 2022.10.18
Posted by 구차니
Linux API/linux2022. 10. 26. 14:24

가능은 한 것 같은데..

[링크 : https://stackoverflow.com/questions/15055065/o-rdwr-on-named-pipes-with-poll]

[링크 : https://man7.org/linux/man-pages/man3/mkfifo.3.html]

 

Macro: int ENXIO“No such device or address.” The system tried to use the device represented by a file you specified, and it couldn’t find the device. This can mean that the device file was installed incorrectly, or that the physical device is missing or not correctly attached to the computer.

[링크 : https://www.gnu.org/software/libc/manual/html_node/Error-Codes.html]

 

+

2022.10.27

POLLIN으로 탐지가 되는 듯?

$ cat rx.c
//#define _GNU_SOURCE

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <linux/fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <sys/poll.h>

#define  FIFO_FILE   "/tmp/fifo"
#define  BUFF_SIZE  1024*768*4
struct pollfd pfd[1];

int main(int argc, char** argv)
{
                int ret = 0;
                int   counter = 0;
                int   fd;
                char  buff[BUFF_SIZE];

                //              printf("argc[%d]\n",argc);
                if ( -1 == mkfifo( FIFO_FILE, 0666)){
                                perror( "mkfifo() 실행에러");
                                exit( 1);
                }

                if ( -1 == ( fd = open( FIFO_FILE, O_RDONLY|O_NONBLOCK))){  //  <---- (A)
                                perror( "open() 실행에러");
                                exit( 1);
                }
                ret = fcntl(fd, F_SETPIPE_SZ, 1024 * 1024);
                pfd[0].fd = fd;
                pfd[0].events = POLLIN;

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

                while( 1 ){
                                int n = poll(pfd, 1, 10);
                                if (n > 0)
                                {
                                        memset( buff, 0, BUFF_SIZE);
                                        ret = read( fd, buff, BUFF_SIZE);
                                        if(ret > 0 )
                                                        printf("ret[%d]\n",ret);
                                        //      printf( "%d: %s\n", counter++, buff);
                                }
                                printf(".");
                                usleep(10000);
                }
                close( fd);
}
$ cat tx.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>

#define  FIFO_FILE   "/tmp/fifo"

int main_loop = 1;
int write_loop = 1;

void sigint_handler(int sig)
{
                main_loop = 0;
                write_loop = 0;
}

void sigpipe_handler(int sig)
{
                write_loop = 0;
}

int main(int argc, char **argv)
{
                int   fd;
                int   fd_r;
                //   char *str   = "badayak.com";
                char *str = NULL;
                char *temp = NULL;

                str = (char*)malloc(1024*768*4);
                temp = (char*)malloc(1024*768*4);
                memset(str, *argv[1], 1024*768*4);

//              signal(SIGPIPE, SIG_IGN);
                signal(SIGPIPE, &sigpipe_handler);
                signal(SIGINT, &sigint_handler);
                /*
                   printf("%d\n",__LINE__);
                   if ( -1 == mkfifo( FIFO_FILE, 0666)){
                   perror( "mkfifo() 실행에러");
                   exit( 1);
                   }
                 */
                while(main_loop)
                {
                                printf("%d\n",__LINE__);
                                do {
                                                fd = open( FIFO_FILE, O_WRONLY | O_NONBLOCK);
                                                usleep(100000);
                                                printf("fd[%d] %d\n",fd,__LINE__);
                                                if(main_loop == 0 && write_loop == 0) exit(1);
                                } while(fd == -1);
                                write_loop = 1;

                                int ret = 0;
                                while(write_loop)
                                {
                                                printf("%d\n",__LINE__);
                                                int a = write( fd, str, atoi(argv[1]));
                                                printf("%d a[%d]\n",__LINE__,a);
                                                usleep(1000000);
                                }
                }
                close( fd);
}

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

pthread  (0) 2022.11.23
iio(industrial io) 문서  (0) 2022.11.11
‘F_SETPIPE_SZ’ undeclared  (0) 2022.10.20
linux fifo  (0) 2022.10.18
SIGPIPE  (0) 2022.10.17
Posted by 구차니
Linux API/linux2022. 10. 20. 10:50

커널이 5.4.0 이라 그런가

해당 선언을 해주어야 에러가 사라진다.

 

#define _GNU_SOURCE

[링크 : https://stackoverflow.com/questions/25411892/f-setpipe-sz-undeclared]

 

 

Defining _GNU_SOURCE has nothing to do with license and everything to do with writing (non-)portable code. If you define _GNU_SOURCE, you will get:
  1. access to lots of nonstandard GNU/Linux extension functions
  2. access to traditional functions which were omitted from the POSIX standard (often for good reason, such as being replaced with better alternatives, or being tied to particular legacy implementations)
  3. access to low-level functions that cannot be portable, but that you sometimes need for implementing system utilities like mount, ifconfig, etc.
  4. broken behavior for lots of POSIX-specified functions, where the GNU folks disagreed with the standards committee on how the functions should behave and decided to do their own thing.
As long as you're aware of these things, it should not be a problem to define _GNU_SOURCE, but you should avoid defining it and instead define _POSIX_C_SOURCE=200809L or _XOPEN_SOURCE=700 when possible to ensure that your programs are portable.
In particular, the things from _GNU_SOURCE that you should never use are #2 and #4 above.
 

[링크 : https://stackoverflow.com/questions/5582211/what-does-define-gnu-source-imply]

 

호환성 지정 매크로

[링크 : https://m.blog.naver.com/netiz21/150015716721]

 

#include <fcntl.h> 대신

#include <linux/fcntl.h> 하면 _GNU_SOURCE를 해주지 않아도 되긴 한데

다른데서 경고가 뜨니 알아서 써야 할 듯.

/usr/include/linux/fcntl.h:28:#define F_SETPIPE_SZ (F_LINUX_SPECIFIC_BASE + 7)
/usr/include/linux/fcntl.h:29:#define F_GETPIPE_SZ (F_LINUX_SPECIFIC_BASE + 8)

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

iio(industrial io) 문서  (0) 2022.11.11
mkpipe 와 poll  (0) 2022.10.26
linux fifo  (0) 2022.10.18
SIGPIPE  (0) 2022.10.17
linux ipc 최대 데이터 길이  (0) 2022.10.11
Posted by 구차니
Linux API/linux2022. 10. 18. 18:20

특이하다면 특이하고, 당연하다면 당연하게

fifo는 쓸 녀석과, 읽을 녀석이 둘다 요청이 들어올때 까지 open() 에서 blocking 된다.

 

strace를 이용해서 확인해보면 각각 실행할 경우

O_RDONLY를 주던 O_WRONLY를 주던 간에 open() 함수에서 block 되어있다

두개 프로그램이 read/write pair가 만들어지면 그제서야 open()을 넘어가게 된다.

open()을 non_block 으로 해서 name pipe의 pair가 만들어지길 기다리는 것도 방법 일 듯.

 

$ strace ./rx
openat(AT_FDCWD, "/tmp/fifo", O_RDONLY
$ strace ./tx 2
openat(AT_FDCWD, "/tmp/fifo", O_WRONLY

[링크 : https://tutorialspoint.dev/computer-science/operating-systems/named-pipe-fifo-example-c-program]

 

걍 이렇게 하고 나서 해보면 되려나?

int fifo_fd = open(fifo_path, O_RDONLY | O_NONBLOCK);
FILE *fp = fdopen(fifo_fd, "r");

[링크 : https://cboard.cprogramming.com/c-programming/89358-nonblocking-fifo.html]

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

mkpipe 와 poll  (0) 2022.10.26
‘F_SETPIPE_SZ’ undeclared  (0) 2022.10.20
SIGPIPE  (0) 2022.10.17
linux ipc 최대 데이터 길이  (0) 2022.10.11
ipc 성능 비교  (0) 2022.09.21
Posted by 구차니
Linux API/linux2022. 10. 17. 17:56

mkfifo()를 이용하여 named pipe를 해보는데

받는 쪽이 사라지니 보내는 애가 갑자기 에러도 없이 죽어

gdb로 확인해보니 SIGPIPE가 전달되었고 그로 인해서 프로세스가 종료 된 것으로 보인다.

Program received signal SIGPIPE, Broken pipe.
0x00007ffff7af2104 in __GI___libc_write (fd=3, buf=0x7ffff76e1010, nbytes=3145728)
    at ../sysdeps/unix/sysv/linux/write.c:27
27      ../sysdeps/unix/sysv/linux/write.c: 그런 파일이나 디렉터리가 없습니다.

[링크 : https://jacking75.github.io/linux_socket_sigpipe/]

 

gdb 에서 무시하게 하려면 아래의 명령어를 입력하라고 한다.

handle SIGPIPE nostop pass pass

[링크 : http://egloos.zum.com/mirine35/v/5057019]

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

‘F_SETPIPE_SZ’ undeclared  (0) 2022.10.20
linux fifo  (0) 2022.10.18
linux ipc 최대 데이터 길이  (0) 2022.10.11
ipc 성능 비교  (0) 2022.09.21
posix message queue  (0) 2022.09.21
Posted by 구차니
Linux API/linux2022. 10. 11. 14:39

ipc 타입에 따라 작다면 작고, 크다면 큰 용량이 할당되어 있다

 

pipe

$ cat /proc/sys/fs/pipe-max-size
1048576

[링크 : https://unix.stackexchange.com/questions/11946]

uds (UNIX Domain Socket)

$ cat /proc/sys/net/core/wmem_max
212992

[링크 : https://stackoverflow.com/questions/21856517]

 

message queue

$ sysctl -a |grep kernel.msg
kernel.msgmax = 8192
kernel.msgmnb = 16384
kernel.msgmni = 32000

[링크 : https://dobby-the-house-elf.tistory.com/402]

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

linux fifo  (0) 2022.10.18
SIGPIPE  (0) 2022.10.17
ipc 성능 비교  (0) 2022.09.21
posix message queue  (0) 2022.09.21
zeroMQ  (0) 2022.09.20
Posted by 구차니
Linux API/linux2022. 9. 21. 19:08

zmq는 이런데서는 확 떨어지는 구나

 

Shared Memory > MQ > UDS > FIFO > Pipe > TCP 이런식인데

POSIX Message Queue가 생각외로 성능이 잘 나와서 놀랍다.

IPC Message rate
Pipe 36539 msg/s
FIFOs (named pipes)  26246 msg/s
Message Queue  67920 msg/s
Shared Memory  3821893 msg/s
TCP sockets 22483 msg/s
Unix domain sockets  40683 msg/s
ZeroMQ  15414 msg/s

 

[링크 : https://stackoverflow.com/questions/50171306/message-queue-vs-tcp-ip-socket-which-ipc-is-faster-in-linux]

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

SIGPIPE  (0) 2022.10.17
linux ipc 최대 데이터 길이  (0) 2022.10.11
posix message queue  (0) 2022.09.21
zeroMQ  (0) 2022.09.20
파일 존재유무 확인하기  (0) 2022.02.11
Posted by 구차니
Linux API/linux2022. 9. 21. 19:01

4세대 벤치에서는 mq가 udp sock보다 빠르다고

https://the-linux-channel.the-toffee-project.org/index.php?page=8-tutorials-research-socket-overhead-in-linux-vs-message-queues-and-benchmarking

https://reakwon.tistory.com/m/209

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

linux ipc 최대 데이터 길이  (0) 2022.10.11
ipc 성능 비교  (0) 2022.09.21
zeroMQ  (0) 2022.09.20
파일 존재유무 확인하기  (0) 2022.02.11
select, poll, epoll  (0) 2021.11.02
Posted by 구차니