rask24 / minishell

3 stars 0 forks source link

Handle a lot of pipes #57

Open rask24 opened 6 days ago

rask24 commented 6 days ago

Description

need to handle a lot of pipes (about 1000 times?)

current implementation

/bin/echo Hello | /bin/cat ...(126 times or more) |  /bin/cat
minishell: pipe: Too many open files

On bash5.2

/bin/echo Hello | /bin/cat ...(126 times or more) |  /bin/cat
Hello

around 1088 times

bash: fork: retry: Resource temporarily unavailable
bash: child setpgid (42146 to 41059): Operation not permitted
Hello

Generate experiment commands

Create and Edit cmd.rb

cmd = "/bin/echo Hello"
pipe_cmd = " | /bin/cat"
iters = 127

iters.times do
  cmd << pipe_cmd
end

puts cmd

Execute ruby script

ruby cmd.rb | pbcopy
rask24 commented 6 days ago

Analysis

On minishell

minishell$ /bin/ls | /bin/sleep 100 | /bin/ls | /bin/cat | /bin/cat | /bin/cat | /bin/cat

On another terminal

❯ lsof -p 43417 [specify sleep process ID]
COMMAND   PID       USER   FD   TYPE             DEVICE SIZE/OFF                NODE NAME
sleep   43417 reiyaasuke  cwd    DIR               1,14      768            68945239 /Users/reiyaasuke/clang/minishell
sleep   43417 reiyaasuke  txt    REG               1,14   101136 1152921500312524816 /bin/sleep
sleep   43417 reiyaasuke    0   PIPE 0x7f57a6905b0dab22    16384
sleep   43417 reiyaasuke    1   PIPE 0x53dd2f2f2e5ff791    16384                     ->0x9feba781fac0d1e5
sleep   43417 reiyaasuke    2u   CHR               16,4 0t758805                 711 /dev/ttys004
sleep   43417 reiyaasuke    3   PIPE 0x8737980479b11302    16384                     ->0x773c0f09d01f6269
sleep   43417 reiyaasuke    4   PIPE 0x773c0f09d01f6269    16384                     ->0x8737980479b11302
sleep   43417 reiyaasuke    5   PIPE 0xcec5cde978aaf026    16384                     ->0x3de0087b8f6ae81a
sleep   43417 reiyaasuke    6   PIPE 0x3de0087b8f6ae81a    16384                     ->0xcec5cde978aaf026
sleep   43417 reiyaasuke    7   PIPE 0x9a787bb322d29521    16384                     ->0xe9b1227ae256ee54
sleep   43417 reiyaasuke    8   PIPE 0xe9b1227ae256ee54    16384                     ->0x9a787bb322d29521
sleep   43417 reiyaasuke    9   PIPE  0xff6f96b917fcdfe    16384                     ->0x7b635e6e29956900
sleep   43417 reiyaasuke   10   PIPE 0x7b635e6e29956900    16384                     ->0xff6f96b917fcdfe
sleep   43417 reiyaasuke   11   PIPE 0x9feba781fac0d1e5    16384                     ->0x53dd2f2f2e5ff791

On bash

bash-5.2$ /bin/ls | /bin/sleep 100 | /bin/ls | /bin/cat | /bin/cat | /bin/cat | /bin/cat
❯ lsof -p 43720
COMMAND   PID       USER   FD   TYPE             DEVICE SIZE/OFF                NODE NAME
sleep   43720 reiyaasuke  cwd    DIR               1,14      768            68945239 /Users/reiyaasuke/clang/minishell
sleep   43720 reiyaasuke  txt    REG               1,14   101136 1152921500312524816 /bin/sleep
sleep   43720 reiyaasuke    0   PIPE 0xd1d89aa3ebcd59d0    16384
sleep   43720 reiyaasuke    1   PIPE 0xe28e40be9f5afe9b    16384
sleep   43720 reiyaasuke    2u   CHR               16,4 0t768380                 711 /dev/ttys004