C프로그램과 쉘프로그램의 속도, 부하치이

hackcode의 이미지

쉘로 만들어진 프로그램을 C로 바꾸려고 합니다.

문자열을 처리 하는 일이 많아 awk, sed 등을 많이 사용하구요.
그 쉘 속에서 또다른 쉘 프로그램이나 다른 프로그램을 자주 실행시킵니다.

질문 1. 위와 같은 프로그램을 C로 바꿀경우 문자열처리부분을 그냥 C코드로
일일이 해주는게 나을까요? 아니면 그냥 exec 등의 함수로 매번 fork하고 나서
awk, sed 등을 그대로 해주고 처리하는게 나을까요?

질문 2. 또다른 프로그램을 실행시키는 것도 매번 fork 하고 난 후 exec
해야 하니까 10개 이상 계속 그래야한다면 오히려 쉘로 된것 보단 C가 무조건
좋다고 볼 수 없진 않나요? 그렇게 무식하게 해줘도 C로 바꿔주는게 더 나을까요?

질문 3. 저렇듯 문자열처리나 다른 일을 위해 다른 프로그램을 호출할 경우가
많은 경우 system() 이나 exec 말고 다른 유연한 방법은 없을까요?

cdpark의 이미지

문자열 처리가 많다면 C 언어보다 perl/python 등의 script 언어로 바꾸는게 어떨까요?

성능 등에 문제가 있는게 아니라면 그냥 그대로 놔 두고요.

hackcode의 이미지

참..
한가지 빠트린게...
스크립트에서 C로 변환시킬려고 하는건 root권한을 줄 예정인데
소스코드가 다 보여지게 되므로 속도도 좀 빠르게 할겸.. 코드도 숨길겸해서
입니다...

cdpark의 이미지

setuid된 C 프로그램 하나 짜서 그 프래그램이 원래의 shell script를 부르게 하시면 되겠네요. shell script의 퍼미션은 700으로.. :)

hackcode의 이미지

root 권한 자체를 줘야하는 임베디드 장비입니다...
그냥 앞에 질문 다 무시하구요...

반드시 C로 구현을 해야 하는 프로그램인데,
복잡한 문자열 처리를 그냥 C로 하는게 좋을까요? 아니면
C코드 내에서 awk등을 한번 불러서 처리하는게 좋을까요?

익명 사용자의 이미지

C로 코딩하세요.

또한 C로 한다해도 awk{}나 sed로 복잡한 문자열 파싱을 해야 할 연유는 없어 보입니다.

단, (v)fork() -> execX()로 이어지는 식으로 코딩을 한다면, 콘쉘인지, 본쉘인지, 시쉘인지 알 수는 없으나... 암튼 쉘 스크립트를 이용한 본래의 프로그램에 비해 전혀 나을 것이 없습니다.

지금 저의 머릿속에 그려지는 그림으로는...

첫째로 popen 함수를 이용해 쉘상의 명령어를 해석하여 변수에 메모리 카피를 하던, 스트링 처리를 하건, 그냥 스탠다드 콘솔 아웃풋을 쓰건... 님의 마음이고, 일단 그렇게 처리를 하는 루틴을 짜서 함수로 맹급니다.

다음에 pthread를 이용해서, 필요한 명령어 라인을 변수에 담아 아귀먼트 4번에 넣어주고, 스레드를 만들어버리는 겁니다. 그 담에 제대로 리턴되는 지 알기 위해서, join을 쓰면 간단하게 해결될 문제인 것 같습니다.

그런 식으로 간단하게 반복문을 돌리는 거죠.

fork()를 쓰면 wait() 메소드를 이용해서 삽질하는 것보다 나으리라 봅니다.

뭐, 스레드 쓴담에 어차피 잘못되서 뒤진다고 해서 본래의 쉘 프로그램은 안 뒤졌던게 아니니까요. -0-

다른 한 방법은 시간이 없을때 그냥... system() 불러다가 명령어만 실행해주는 겁니다.

-0-

그래도 되긴 되죠. ㅋㅋㅋ

cdecl의 이미지

root 권한 자체를 줘야하는 임베디드 장비입니다... 
그냥 앞에 질문 다 무시하구요... 

반드시 C로 구현을 해야 하는 프로그램인데, 
복잡한 문자열 처리를 그냥 C로 하는게 좋을까요? 아니면 
C코드 내에서 awk등을 한번 불러서 처리하는게 좋을까요? 

이것은 딱히 이렇게 해야된다라고 답이 없는 문제 같습니다.
C은 숙련도 여부와 업무의 특성을 고려해서 ...

예를들어 C를 잘한다면 모든걸 C로 하는게 낳겠죠
파싱부분이 복잡하지 않다면 구현하면되고 복잡하다면 다른 라이브러리의 도움을 받고 ..

만약 C에 자신이 없다면 기본적인 입출력만 구현하시고 awk같은 툴을 이용하는것도 낳겠죠.

물론 여러가지 상황이 있을수 있겠지만 성능은 대부분 C로 그냥 구현하시는게 낳을것이라고 봅니다만 ...

그러나 여의치 않다면 다른 shell 명령어를 이용하는 방법도 한가지 방법이고요 ...

결론은 C의 숙련도 여부와 업무의 복잡도에 의해 판단 하셔야 될것 같습니다.
--
cdecl

--
cdecl

mrjh76의 이미지

Jongmin Kim wrote:
쉘로 만들어진 프로그램을 C로 바꾸려고 합니다.

문자열을 처리 하는 일이 많아 awk, sed 등을 많이 사용하구요.
그 쉘 속에서 또다른 쉘 프로그램이나 다른 프로그램을 자주 실행시킵니다.

질문 1. 위와 같은 프로그램을 C로 바꿀경우 문자열처리부분을 그냥 C코드로
일일이 해주는게 나을까요? 아니면 그냥 exec 등의 함수로 매번 fork하고 나서
awk, sed 등을 그대로 해주고 처리하는게 나을까요?

질문 2. 또다른 프로그램을 실행시키는 것도 매번 fork 하고 난 후 exec
해야 하니까 10개 이상 계속 그래야한다면 오히려 쉘로 된것 보단 C가 무조건
좋다고 볼 수 없진 않나요? 그렇게 무식하게 해줘도 C로 바꿔주는게 더 나을까요?

질문 3. 저렇듯 문자열처리나 다른 일을 위해 다른 프로그램을 호출할 경우가
많은 경우 system() 이나 exec 말고 다른 유연한 방법은 없을까요?

저~~~ 혹시, D... 업체에 근무하지 않나요?

저도 본이 아니게... 전 개발자가 쉘 스크립트로 장비를 구성해 놓아서...
그리고 여러가지 사정으로 인해... 쉘 스크립트로 네트웍 장비를 구성한 적이 있습니다.
웹의 관리자 화면까지... 쉘스크립트로... ㅎㅎ

어쩌면... 님의 상황이 예전의 저랑 똑같은지... 후후...
사실, 스크립트의 불필요한 부분만 적당히... 다듬으면... 그다지... 성능은...

일단, 소스 유출이 제일 큰 문제인것 같은데... 쉘 스크립트 컴파일러가 있으니...
컴파일해서... 자동으로 C로 바꾸시고요... (위의 예기처럼 거의 fork, system 으로 구성될 것입니다.)
특별히 신경써야할 부분이 있다면... 그 부분만 C로 작성하시고... (모니터링?)
차차... 버전업 해가면서... C로 전환하시면 될것으로 보입니다!!!

아니면... 기존에 sed, awk 가 파싱하던, 설정파일의 형식을 C가 파싱하기 좋은 형식으로 전환하는것도... 좀 쉬운 방법중에 하나가 되겠네요...

chunsj의 이미지

Jongmin Kim wrote:
참..
한가지 빠트린게...
스크립트에서 C로 변환시킬려고 하는건 root권한을 줄 예정인데
소스코드가 다 보여지게 되므로 속도도 좀 빠르게 할겸.. 코드도 숨길겸해서
입니다...

코드의 보안이 문제라면 다른 사람이 못 보도록 해야 하는 것이지 C로 바꾼다고 해서 문제가 해결되지는 않습니다. 공용으로 쓰는 프로그램인데 보안문제로 바꾸시려는 것인가요? 그렇다면 접근 방법이 좀 잘못된 것 같습니다. 만약 관리자만 사용하실 프로그램이라면 퍼미션 조정을 해서 처리를 하시면 될 일이네요.

전자의 문제라면 C로 바꾸는게 문제가 아니라, 보여지면 안되는 데이터를 암호화하든지 해서 처리를 해야될 문제입니다. 아니라면 strace, lsof 그리고 gdb 같은 걸로 보면 무슨 짓 하는지 거의 다 보입니다.

vuccell의 이미지

그냥 c로 다 하세요... system같은거 쓰시지 마시고..
(그냥 질문자는 이런 답변을 원하신것이 아닐까 하는...) :D

웃는 남자의 이미지

질문자가 원하시는게 "복잡한 문자열처리를 하는 쉘스크립트를
보안상 소스를 숨기면서 성능이 중시되는 임베디드장비에서 돌리는데 이걸 C로 작성해야 된다." 이겠죠?

제 생각에는 C로 바로 작성하기보다 문자열처리에 능한 Perl을 중간단계로 이용하는 것이 좋을 것 같습니다만..
perl로 한다면 우선 쉘스크립트에서 문자열처리를 위해 awk를 호출하여 처리하던 것을 perl script 로 재작성하구요.

그 다음 펄 스크립트를 perlcc 로 optimized 된 c sourcecode로 변환합니다.
다시 c sourcecode를 컴파일해서 standalone executable한 바이너리로 생성해냅니다.
이러면 코드는 감추어질 것이고, 다만 생성된 바이너리가 소스보다 크기가 많이 커진다는 단점과 꼭 성능이 더 좋아지리라고 기대할 수 없다는 점이 있겠네요..흠..

이 주제를 읽으면서 스크립트를 감추는 데에 shell script compiler 를 사용하면 되는 걸 알았습니다. 그래서 찾아보았더니 대부분이 상용이더군요. 구글링해보니 free software 로 된 걸 발견했습니다.

http://www.datsi.fi.upm.es/~frosal/sources/

----------------------------------------
Nothing left after Nirvana.

ssehoony의 이미지

그냥 C로 코딩이 가능하다면 그렇게 하시는게 좋다고 봅니다.

외부 프로그램을 실행하게 된다면 외부프로그램의 존재 유무와 경로문제도
항상 신경을 써야 하는데, 이거 유지 보수때 상당히 불편합니다.

C로 만 코딩하면, 외부프로그램의 사용하는 것 보다 예외사황이 발생할
소지가 대폭 감소하게 되므로 여러모로 장점이 있죠.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.