현재 작업 상태 보기

'jobs' 라는 명령어는 background 작업들과 상태들을 나타내 줍니다.

 

 

Background에서 작업 실행하기

만약 시간이 오래 걸리는 작업이 있다면 background에서 실행해보시는 것은 어떠한가요? 

단지 명령어 뒤에 '&' 를 붙여서 실행하시면 background에서 실행됩니다.

 

 

Foreground 작업을 Background로 옮기기

작업이 빨리 끝날 것이라고 예상하고 실행했지만 엉겁의 시간이 지나도 끝나지 않을 때, 

현재 작업은 놔둔 상태로 다른 작업을 실행하고 싶을 때

Ctrl + Z 를 눌러서 뒤로 돌아갈 수 있습니다.

Ctrl + Z

 

이제 작업들이 멈추었습니다. Background 에서 작업을 실행하기 위해 'bg' 명령어를 사용합니다.

여기서 '1' 은 작업의 ID값으로 'jobs' 명령어를 통해 앞에 나오는 숫자로 ID값을 알 수 있습니다.

 

 

Background 작업을 foreground로 옮기기

Background에서 실행되고 있는 작업을 forground로 옮기기 위해서는 'fg' 명령어를 사용하면 됩니다.

 

 

작업 끝내기

작업을 끝내거나 죽이기 위해서는 'kill' 명령어를 사용합니다. 

이 명령어는 프로세스를 끝내기 위해서도 사용하는 명령어인데 전달되는 매개변수에 의해 어떤 행동을 할지 결정됩니다.

이 명령어를 사용할 때 '%'를 빼먹지 않도록 주의하여야 합니다. 만일 빼먹게 되면 PID 1 인 'init'이나 PID 2 인 'kthread' 를 종료하게 되는데 컴퓨터를 재부팅 해야 할 수도 있습니다.(매우 중요한 작업중이고 저장을 안했다면..)

 

 

Background 작업을 중지시키기

이 부분이 좀 까다로운데 바로 background 작업을 중지 시킬수는 없습니다. 따라서 약간의 명령이 더 필요합니다.

먼저 jobID를 알아내고, 작업을 foreground로 가져오고 Ctrl + Z 를 눌러 중지시킵니다.

(^Z 는 Ctrl + Z 를 누른 것을 나타냅니다.)



출처: https://pragp.tistory.com/entry/Linux리눅스-fg-bg-kill-CtrlZ [Pragmatic Programming]

블로그 이미지

Or71nH

,
news_sender.c: In function ‘main’:
news_sender.c:42:8: warning: passing argument 1 of ‘close’ makes integer from pointer without a cast [-Wint-conversion]
  close((FILE*)fp);
        ^
In file included from news_sender.c:4:0:
/usr/include/unistd.h:356:12: note: expected ‘int’ but argument is of type ‘FILE * {aka struct _IO_FILE *}’
 extern int close (int __fd);
            ^~~~~
mes@ubuntu:~/TcpCom

공부좀 더해야겟음 

 

news_sender.c  보내는애

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define TTL 64
#define BUF_SIZE 30
void error_handling(char *message);

int main(int argc, char *argv[])
{
	int send_sock;
	struct sockaddr_in mul_adr;
	int time_live=TTL;
	FILE *fp;
	char buf[BUF_SIZE];
	if(argc!=3) {
	printf("Usage : %s <GroupIP> <PORT>\n", argv[0]);
	exit(1);
	}

	send_sock=socket(PF_INET, SOCK_DGRAM, 0);
	memset(&mul_adr, 0, sizeof(mul_adr));
	mul_adr.sin_family=AF_INET;
	mul_adr.sin_addr.s_addr=inet_addr(argv[1]);
	mul_adr.sin_port=htons(atoi(argv[2]));

	setsockopt(send_sock, IPPROTO_IP,
		IP_MULTICAST_TTL, (void*)&time_live, sizeof(time_live));
	if((fp=fopen("news.txt", "r"))==NULL)
		error_handling("fopen() error");

	while(!feof(fp))  /* Broadcasting */
	{
		fgets(buf, BUF_SIZE, fp);
		sendto(send_sock, buf, strlen(buf),
			0, (struct sockaddr*)&mul_adr, sizeof(mul_adr));
		sleep(2);
	}
	close((FILE*)fp);
	close(send_sock);
	return 0;
}

void error_handling(char *message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}

 

이애러 뜨는데 알아봐야할듯

 

 

 

news_receiver.c 받는에 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define BUF_SIZE 30
void error_handling(char *message);

int main(int argc, char *argv[])
{
	int recv_sock;
	int str_len;
	char buf[BUF_SIZE];
	struct sockaddr_in adr;
	struct ip_mreq join_adr;
	if(argc!=3) {
		printf("Uszge : %s <GroupIP> <PORT>\n", argv[0]);
		exit(1);
	}

	recv_sock=socket(PF_INET, SOCK_DGRAM, 0);
	memset(&adr, 0, sizeof(adr));
	adr.sin_family=AF_INET;
	adr.sin_addr.s_addr=htonl(INADDR_ANY);
	adr.sin_port=htons(atoi(argv[2]));

	if(bind(recv_sock, (struct sockaddr*) &adr, sizeof(adr))==-1)
		error_handling("bind() error");

	join_adr.imr_multiaddr.s_addr=inet_addr(argv[1]);
	join_adr.imr_interface.s_addr=htonl(INADDR_ANY);

	setsockopt(recv_sock, IPPROTO_IP,
		IP_ADD_MEMBERSHIP, (void*)&join_adr, sizeof(join_adr));

	while(1)
	{
		str_len=recvfrom(recv_sock, buf, BUF_SIZE-1, 0, NULL, 0);
		if(str_len<0)
			break;
		
		buf[str_len]=0;
		fputs(buf, stdout);
	}
	close(recv_sock);
	return 0;
}

void error_handling(char *message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}
블로그 이미지

Or71nH

,

설명

sendto() 함수는 UDP/IP 통신에서 소켓으로 데이터를 전송합니다.

헤더 #include <sys/types.h>
#include
<sys/socket.h>
형태 int sendto(int s, const void *msg, size_t len, int flags, const struct sockaddr *to, socklen_t tolen);
인수  
반환  

이번에는 UDP/IP 소켓 프로그램을 작성하는 방법입니다.

 

UDP/IP는 TCP/IP 처럼 클라이언트와 서버로 나뉘고 1 대 다수의 통신 방식은 아닙니다. 그냥 목적 시스템으로 자료를 전송하면 되는데, 문제는 UDP/IP를 이용하여 자료를 수신 받아야 하는 쪽은 받을 준비를 해야 합니다.

뭐, 당연한 말 아니냐? 하시겠습니다만 socket 을 만들었다고 socket을 통해 자료를 받을 수 없습니다. 생성한 socket을 커널에 올려 놓아야 커널이 socket 을 이용하여 상대방으로부터 전송된 데이터를 수신할 수 있습니다. 그러므로 처음 통신을 할 때, 자료 수신을 먼저 해야 하는 곳은 받드시 bind()를 사용해야 합니다.

UDP/IP 통신 함수 사용 순서

UDP/IP 통신에서는 TCP/IP와는 달리 read()와 write()를 사용하지 않고 recvform()과 sendto()함수를 이용하여 자료를 송수신합니다. sendto()함수를 대신 사용하는 이유는 전송할 목적지를 지정할 수 있기 때문이며, recvform()함수를 사용하는 이유는 수신되는 자료 외에도 송신지의 정보를 함께 얻을 수 있기 때문입니다.

그러므로 TCP/IP처럼 한번 연결되면 연결된 시스템과 자료를 주고 받지만 UDP/IP는 자유롭게 시스템 주소를 바꾸어 가면서 자료를 송수신 할 수 있습니다.

책에서는 TCP/IP를 전화기로 UDP/IP는 우체통으로 비유하는 경우가 많습니다. 우체통으로 비유한 만큼 UDP/IP는 우체통 하나로 여러 사람과 편지를 교환하듯 소켓 하나로 자유롭게 여러 시스템에게 자료를 송/수신할 수 있습니다.

또한 UDP/IP에서도 connect() 함수를 사용하여 read()와 write() 함수를 사용할 수 있습니다. 그러나 여기서는 다루지 않겠습니다.

UCP/IP 예제 소개

평상 시에도 자료를 수신할 수 있는 프로그램과 자료 전송만을 준비한 프로그램으로 나누어 올려 보겠습니다.

  1. 두 프로그램 모두 port 4000번을 사용하며
  2. 자료를 먼저 송신하는 쪽에서 임의의 문자를 전송하면
  3. 수신하는 쪽은 수신된 자료를 겹쳐서 전송하고
  4. 다시 송신하는 쪽에서 수신한 후 수신된 자료를 화면에 출력하겠습니다.

자료 수신 프로그램

자료 수신이 가능한 프로그램의 함수 사용 순서는 아래와 같습니다.

우선 socket 부터 만들어야 합니다. TCP/IP에서는 SOCK_STREAM을 UDP/IP에서는 SOCK_DGRAM을 사용하는 것을 참고하여 주십시오.

int     sock;

sock = socket( PF_INET, SOCK_DGRAM, 0);
if (-1 == sock)
{
   printf( "socket 생성 실패");
   exit( 1) ;
}

bind() 함수를 이용하여 커널에 등록합니다.

    1. 만들어진 sock 은 단지 socket 디스크립터일 뿐입니다.
    2. 이 socket에 주소를 할당하고 port 번호를 할당해서 커널에 등록해야 합니다.
    3. 커널에 등록하면 클라이언트로부터 자료를 수신할 수 있는 귀를 달아 놓는 상태가 됩니다.
    4. socket에 주소와 port 를 할당하기 위해 sockaddr_in 구조체를 이용합니다.

struct sockaddr_in server_addr;

memset( &server_addr, 0, sizeof( server_addr);
server_addr.sin_family      = PF_INET;                   // IPv4 인터넷 프로토롤
server_addr.sin_port        = htons( 4000);              // 사용할 port 번호는 4000
server_addr.sin_addr.s_addr = htonl( INADDR_ANY);        // 32bit IPV4 주소

if( -1 == bind( sock, (struct sockaddr*)&server_addr, sizeof( server_addr) ) )
{
   printf( "bind() 실행 에러n");
   exit( 1);
}

  1. htonl( INADDR_ANY) 는 주소를 지정해 주는 것으로 inet_addr( "내 시스템의 IP ")로도 지정할 수 있습니다. 그러나 프로그램이 실행되는 시스템 마다 IP 가 다를 것이므로 주소 지정을 고정 IP로 하지 않고 htonl( INADDR_ANY) 를 사용하는 것이 편리합니다.

이제 socket 을 커널에 등록했으므로 recvfrom() 또는 sendto()를 이용하여 자료를 송수신할 수 잇습니다. recvfrom() 함수를 이용하여 클라이언트로부터 전송되어 오는 자료를 읽어 들입니다.

    1. recvfrom()을 이용하여 송신 측의 주소 정보를 받아 오기 위해 변수를 선언합니다.

struct sockaddr_in client_addr;
int                client_addr_size;

    1. recvfrom()으로 자료를 수신합니다.

client_addr_size = sizeof( client_addr);
recvfrom( sock, buff_rcv, BUFF_SIZE, 0 ,
            ( struct sockaddr*)&client_addr, &client_addr_size);

  1. 수신한 자료가 있다면 자료는 buff 에 저장되며, client_addr에 송신측의 주소 정보가 담기게 됩니다.
  2. client_addr를 이용하여 송신한 측으로 자료를 전송할 수 있습니다.

sendto() 함수를 이용하여 데이터를 전송합니다.

    1. 전송 데이터를 준비합니다.

sprintf( buff_snd, "%s%s", buff_rcv, buff_rcv);

  1. sendto() 를 이용하여 클라이언트로 자료를 송신합니다.

    sendto( sock, buff_snd, strlen( buff_snd)+1, 0,
             ( struct sockaddr*)&client_addr, sizeof( client_addr)); // +1: NULL까지 포함해서 전송

  2. 위의 작업을 반복합니다.

자료 전송 프로그램

자료를 전송하는 쪽은 bind() 함수를 사용할 필요가 없으며, bind()함수를 사용하지 않았기 때문에 다른 시스템에서 전송하여도 전송 사실 자체를 알 수가 없습니다. 바로 설명 들어갑니다.

socket() 을 이용하여 소켓을 먼저 생성합니다.

int    sock;

sock= socket( PF_INET, SOCK_DGRAM, 0);
if( -1 ==sock)
{
   printf( "socket 생성 실패n");
   exit( 1);
}

컨널에 socket 을 등록할 필요 없이 sendto()로 자료를 송신할 수 있습니다.

    1. 상대 시스템이 실행 중인지는 모릅니다. 그러나 전송할 수 있습니다.
    2. 상대 시스템의 주소 정보를 준비합니다.

struct sockaddr_in server_addr;

memset( &server_addr, 0, sizeof( server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons( 4000);
server_addr.sin_addr.s_addr= inet_addr( "127.0.0.1");

  1. sendto() 함수로 데이터를 전송합니다.

    sendto( sock, argv[1], strlen( argv[1])+1, 0,
             ( struct sockaddr*)&server_addr, sizeof( server_addr)); // +1: NULL까지 포함해서 전송

sendto() 함수를 사용하여 커널에 소켓이 등록되므로, 이번에는 recvfrom() 함수를 이용하여 상대로부터 자료를 읽어 들일 수 있습니다.

    1. recvfrom()을 이용하여 송신 측의 주소 정보를 받아 오기 위해 변수를 선언합니다.

struct sockaddr_in server_addr;
int                server_addr_size;

    1. recvfrom()으로 자료를 수신합니다.

server_addr_size= sizeof(server_addr);
recvfrom( sock, buff_rcv, BUFF_SIZE, 0 ,
            ( struct sockaddr*)&server_addr, &server_addr_size);

  1. 수신한 자료가 있다면 자료는 buff 에 저장됩니다.
  1. 수신된 자료를 화면에 출력하고 종료합니다.

    printf( "receive: %sn", buff_rcv);
    close( sock);
    return 0;

자료를 수신하는 쪽의 프로그램 소스

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>

#define  BUFF_SIZE   1024

int   main( void)
{
   int   sock;
   int   client_addr_size;

   struct sockaddr_in   server_addr;
   struct sockaddr_in   client_addr;

   char   buff_rcv[BUFF_SIZE+5];
   char   buff_snd[BUFF_SIZE+5];



   sock  = socket( PF_INET, SOCK_DGRAM, 0);
   
   if( -1 == sock)
   {
      printf( "socket 생성 실패n");
      exit( 1);
   }

   memset( &server_addr, 0, sizeof( server_addr));
   server_addr.sin_family     = AF_INET;
   server_addr.sin_port       = htons( 4000);
   server_addr.sin_addr.s_addr= htonl( INADDR_ANY);

   if( -1 == bind( sock, (struct sockaddr*)&server_addr, sizeof( server_addr) ) )
   {
      printf( "bind() 실행 에러n");
      exit( 1);
   }

   while( 1)
   {
      client_addr_size  = sizeof( client_addr);
      recvfrom( sock, buff_rcv, BUFF_SIZE, 0 , 
                     ( struct sockaddr*)&client_addr, &client_addr_size);
      printf( "receive: %sn", buff_rcv);
      
      sprintf( buff_snd, "%s%s", buff_rcv, buff_rcv);
      sendto( sock, buff_snd, strlen( buff_snd)+1, 0,  // +1: NULL까지 포함해서 전송
                     ( struct sockaddr*)&client_addr, sizeof( client_addr)); 
   }
}

자료를 송신하는 쪽의 프로그램 소스

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>

#define  BUFF_SIZE   1024

int   main( int argc, char **argv)
{
   int   sock;
   int   server_addr_size;

   struct sockaddr_in   server_addr;

   char   buff_rcv[BUFF_SIZE+5];


   sock  = socket( PF_INET, SOCK_DGRAM, 0);
   
   if( -1 == sock)
   {
      printf( "socket 생성 실패n");
      exit( 1);
   }

   memset( &server_addr, 0, sizeof( server_addr));
   server_addr.sin_family     = AF_INET;
   server_addr.sin_port       = htons( 4000);
   server_addr.sin_addr.s_addr= inet_addr( "127.0.0.1");

   sendto( sock, argv[1], strlen( argv[1])+1, 0,    // +1: NULL까지 포함해서 전송
            ( struct sockaddr*)&server_addr, sizeof( server_addr));          

   server_addr_size  = sizeof( server_addr);
   recvfrom( sock, buff_rcv, BUFF_SIZE, 0 , 
            ( struct sockaddr*)&server_addr, &server_addr_size);
   printf( "receive: %sn", buff_rcv);
   close( sock);
   
   return 0;
}

 

http://forum.falinux.com/zbxe/index.php?document_srl=441113&mid=C_LIB

블로그 이미지

Or71nH

,

   

퍼미션(권한)이란?

Owner

Group

Other

Owner와 Group은 파일소유자자신과 자신이 속한그룹. Other은 제3자, 웹사이트 방문객은 제3자로 nobody로 취급.

r

w

x

r

w

x

r

w

x

r은 파일 읽기(4), w는 파일 쓰기(2), x는 파일 실행(1)

7

5

5

파일소유자는 그것을 읽고 쓰고 실행시킬 수 있지만, 제3자는 읽고 실행만 시킬 수 있다.

7

7

7

제3자도 쓰기 권한이 주어진다.

*.html  *.cgi, *.pl *.txt등의 파일은 업로드시 반드시 ascii로 하고 나머지 그림(*.gif *.jpg)이나 자바 애플릿(*.class), 실행파일(*.exe *.zip *.rar)등은 binary mode로 업로드 할 것.

   

리눅스 기본명령어

명령어

사 용 법

login

사용자 인증과정

리눅스 시스템은 기본적으로 multi-user 개념에서 시작하였기 때문에 시스템을 이용하기 위해서는 반드시 로그인을 하여야 합니 다. 로그인은 PC 통신에서도 많이 사용되어져 왔기 때문에 그 개 념  설정에 그다지 어려움이 없을 것입니다. 흔히 말하는 ID를 입력하는 과정입니다. 

passwd

패스워드 변경

리눅스, 특히 인터넷의 세계에서는 일반 컴퓨팅 상황에 비하여 훨씬 해킹에 대한 위험이 높습니다. 패스워드는 완성된 단어 보다는 단어 중간에 숫자나 키보드의 ^, #, ' 등과 같은 쉽게 연상 할 수 없는 기호를 삽입하여 만들어 주는 것이 좋습니다

du

하드사용량 체크(chkdsk)

자신의 하드공간을 알려면
# du
특정 디렉토리의 사용량을 알려면
# du -s diretory_name

ls

파일 리스트 보기(dir)

F : 파일 유형을 나타내는 기호를 파일명 끝에 표시
    (디렉토리는 '/', 실행파일은 '*', 심볼릭 링크는 '@'가 나타남).
l  : 파일에 관한 상세 정보를 나타냅니다.
a : dot 파일(.access 등)을 포함한 모든 파일 표시.
t  : 파일이 생성된 시간별로 표시
C : 도스의 dir/w명령과 같 이 한줄에 여러개의 정보를 표시
R : 도스의 dir/s 명령과 같이 서브디렉토리 내용까지.

(예)
# ls -al  
# ls -aC
# ls -R

cd

디렉토리를 변경

# cd cgi-bin     : 하부 디렉토리인 cgi-bin으로 들어감.
# cd  ..             : 상위디렉토리로 이동
# cd 또는 cd ~  : 어느곳에서든지 자기 홈디렉토리로 바로 이동
# cd /webker     : 현재 작업중인 디렉토리의 하위나 상위 디렉토리가
                          아닌 다른 디렉토리(webker)로 이동하려면 /로
                          시작해서 경로이름을 입력하면 된다.

cp

화일 복사(copy)

# cp index.html index.old
     : index.html 화일을 index.old 란 이름으로 복사.

# cp /home/test/*.*  .
     : test 디렉토리내의 모든 화일을 현 디렉토리로 복사.

mv

파일이름(rename) / 위치(move)변경

# mv index.htm index.html
     : index.htm 화일을 index.html 로 이름 변경

$ mv file  ../main/new_file
     : 파일의 위치변경

mkdir

디렉토리 생성

# mkdir download  : download 디렉토리 생성

rm

화일삭제

# rm test.html : test.html 화일 삭제
# rm -r <디렉토리> : 디렉토리 전체를 삭제
# rm -i a.*
     : a로 시작하는 모든 파일을 일일이 삭제할 것인지 확인하면서 삭제 

rmdir

디렉토리 삭제

# rmdir cgi-bin : cgi-bin 디렉토리 삭제

pwd

현재의 디렉토리 경로를 보여주기

pico

리눅스용 에디터

put

ftp 상태에서 화일 업로드

> put  guestbook.tar.gz

get

ftp 상태에서 화일 다운로드

> get  guestbook.tar.gz

mput 또는 mget

여러개의 화일을 올리고 내릴때 (put,get과 사용법동일)

chmod

화일 permission 변경

리눅스에서는 각 화일과 디렉토리에 사용권한을 부여.

예) -rwxr-xr-x   guestbookt.html
rwx  :처음 3개 문자 = 사용자 자신의 사용 권한
r-x  :그다음 3개 문자 = 그룹 사용자의 사용 권한
r-x  :마지막 3개 문자 = 전체 사용자의 사용 권한

읽기(read)---------- 화일 읽기 권한
쓰기(write)---------- 화일 쓰기 권한
실행(execution)---------- 화일 실행 권한
없음(-)---------- 사용권한 없음

명령어 사용법
chmod [변경모드] [파일]

# chmod 666  guestbook.html
     : test.html 화일을 자신에게만 r,w,x 권한을 줌

# chmod 766  guestbook.html
     : 자신은 모든 권한을 그룹사용자와,전체사용자에게는
       읽기와 쓰기 권한만 줌

alias

" doskey alias" 와 비슷하게 이용할 수 있는 쉘 명령어 alias는 말그대로 별명입니다. 사용자는 alias를 이용하여 긴 유 닉스 명령어를 간단하게 줄여서 사용할 수도 있습니다.
이들 앨리어스는 [alias ls 'ls -al'] 같이 사용하시면 되는데, 한 번 지정한 alias를 계속해서 이용하시려면, 자신의 홈디렉토리에 있는
.cshrc(Hidden 속성)을 pico등의 에디터를 이용하여 변경시 키면 됩니다.

cat

파일의 내용을 화면에 출력하거나 파일을 만드는 명령( 도스의 TYPE명령)

# cat filename

more

cat 명령어는 실행을 시키면 한 화면을 넘기는 파일일 경우 그 내용을 모두 볼수가 없다. 하지만 more 명령어를 사용하면 한 화면 단위로 보여줄 수 있어 유용.

# more <옵션>
옵션은 다음과 같습니다.

Space bar : 다음 페이지
Return(enter) key : 다음 줄
v : vi 편집기로 전환
/str : str 문자를 찾음
b : 이전 페이지
q : more 상태를 빠져나감
h : 도움말
= : 현재 line number를 보여줌

who

현재 시스템에 login 하고 있는 사용자의 리스트를 보여줍니다.

# who

whereis

소스, 실행파일, 메뉴얼 등의 위치를 알려줍니다

# whereis perl : perl의 위치를 알려준다

vi,
touch,
cat

새로운 파일을 만드는 방법

# vi newfile :  vi 편집기 상태로 들어감
# touch newfile : 빈 파일만 생성됨
# cat > newfile  : vi 편집기 상태로 들어감, 문서 작성후 Ctrl+D로 빠져나옴

cat,
head,
tail

파일 내용만 보기

# cat filename         : 파일의 내용을 모두 보여줌
# head -n filename : n줄 만큼 위세서부터 보여줌
# tail -n filename     : n줄 만큼 아래에서부터 보여줌

 

   

압축명령어 사용법

압축 명령어

사 용 법

tar .tar, _tar로 된 파일을 묶거나 풀때 사용하는 명령어
(압축파일이 아님)

# tar cvf [파일명(.tar, _tar)] 압축할 파일(또는 디렉토리): 묶을때
# tar xvf [파일명(.tar, _tar)]  :  풀 때
   (cf) cvfp/xvfp 로 하면 퍼미션 부동 
compress 확장자 .Z 형태의 압축파일 생성

# compress    [파일명]     : 압축시
# uncompress [파일명]    : 해제시
gzip 확장자  .gz, .z 형태의 압축파일 생성

#  gzip     [파일명]    : 압축시
#  gzip -d [파일명]   : 해제시
기타 .tar.Z
이것은 tar로 묶은 후에 compress를 사용하여 압축한 것으로 uncompress를 사용해서 압축을 푼 다음,
다시 tar를 사용해서 원래의 파일들을 만들어내면 됩니다.
아니면 다음과 같이 한 번에 풀 수도 있다.
# zcat  [파일명].tar.Z  : 해제시

.tar.gz또는 .tar.z
# gzip -cd [파일명]    : 해제시

.tar.gz 또는 .tar.z .tgz
gzip을 사용해서 푼 다음 다시 tar를 사용해서 원래 파일을 만들어 낼 수 있으나,
하지만 다음과 같이 하면 한 번에 처리를 할 수 있다.

# gzip -cd 파일.tar.gz | tar xvf -  또는
# tar xvzf 파일.tar.gz
# tar xvzf 파일.tgz

 

   

리눅스 필수명령어

Linux/Unix 명령어

설 명

MS-DOS 비교

./x

x 프로그램 실행
(현재 디렉토리에 있는 것)

x

↑/ ↓

이전에(↑) / 다음에(↓) 입력했던 명령어

doskey

cd x (또는 cd /x)

디렉토리 X로 가기

cd

cd .. (또는 cd ../ 또는 cd /..)

한 디렉토리 위로 가기

cd..

x 다음 [tab] [tab]

x 로 시작하는 모든 명령어 보기

-

adduser

시스템에 사용자 추가

/

ls (또는 dir)

디렉토리 내부 보여주기

dir

cat

터미널 상의 텍스트 파일 보기

type

mv x y

파일 x를 파일 y로 바꾸거나 옮기기

move

cp x y

파일 x를 파일 y로 복사하기

copy

rm x

파일 지우기

del

mkdir x

디렉토리 만들기

md

rmdir x

디렉토리 지우기

rd

rm -r x

디렉토리 x를 지우고 하위도 다 지우기

deltree

rm p

패키지 지우기

-

df (또는 df x)

장치 x의 남은 공간 보여주기

chkdsk ?

top

메모리 상태 보여주기(q는 종료)

mem

man x

명령어 x에 관한 매뉴얼 페이지 얻기

/

less x

 텍스트 파일 x 보기
(리눅스에서는 더 많은 필터 적용 가능)

type x | more

echo

어떤 것을  echo 화면에 인쇄한다.

echo

mc

UNIX를 위한 노턴 커맨더

nc

mount

장치 연결(예: CD-ROM, 연결을 해제하려면 umount)

-

halt

시스템 종료

-

reboot ([ctrl] + [alt] +[del])

시스템  다시 시작하기

[ctrl] + [del] + [del]

    

고급명령어

 고급 명령어

 

chmod <권한> <파일>

파일 권한(permissions) 변경

ls -l x

파일 x의 자세한 상황을 보여줌

ln -s x y

 x에서 y로 심볼릭 링크를 만들어 줌

find x -name y -print

디렉토리 x안에서 파일 y를 찾아서 화면에 그 결과를 보여줌

ps

지금 작동중인 모든 프로세스들을 보여줌

kill x

 프로세스 x를 종료 (x는 ps 명령으로 알 게 된 PID)

[alt] + F1 - F7

 터미널 1-7까지 바꾸기 (텍스트 터미널에서; F7은 X-윈도우(시작될때))

lilo

 부트 디스크를 만듦

 

용어

 

symlink

다른 파일이나 디렉토리로 심볼릭 링크. 윈도유98의 바로가기 같은 것

shell script

여러 명령어들을 차례로 수행하게 한 것. MS-DOS의 배치 파일 같은 것

     

팁!!

 - 웹에서 생성한 노바디파일 삭제 하는방법..

기본적으로 웹서버는 nobody 권한으로 동작이 되게 됩니다.
고객님께서 FTP 로 접속하여 전송한 파일이 아니라 웹상에서 사용자들이 파일을 업로드 한 경우나 웹상에서 생성된 파일의 경우 삭제가 되지 않는 경우가 있을 수 있습니다.

웹서버의 동작 권한은 nobody 이고 웹상에서 생성된 파일이므로 해당 파일이 nobody 소유권으로 시스템에 생성이 되게 됩니다.

아래와 같이 웹상에서 실행시키면 됩니다.

1. 메모장을 열어 아래 소스를 붙여넣기 하신후..

<?

//폴더/파일 삭제시

$cmd = `rm -rf 노버디로된파일혹은폴더명`;

echo "$cmd";

echo "폴더가 삭제 되었습니다.";

?>

-- 위에까지..
-- **위에서 수정할 사항은 "노버디로된파일혹은폴더명"을 삭제하시고자 하는 파일명으로 바꿔주세요..

2. 파일 -> 다른이름으로저장 -> 아래 탭에서 파일형식을 "모든파일"로 선택후

   -> "원하는파일명.php" 로 저장 (ex: del.php)

3. ftp를 통해 고객계정에 파일업로드를 하시고 웹에서 파일을 불러주시면 됩니다

   ex: html폴더안에/temp 안에 삭제하고자하는 파일이 있을경우 / html폴더/temp안에 del.php를 업로드하고..

       브라우저에서 http://고객도메인/temp/del.php 를 하면 됩니다

4. 실행하시면 삭제되고 nobody 권한의 폴더만 남습니다.(폴더안의화일들만 지워짐)

   그후 ftp 접속후 폴더를 삭제하시면 됩니다.

ex)

<?

퍼미션 변경시

$cmd = `chmod -R 777 노버디로된파일혹은폴더명`;

echo "$cmd";

echo "퍼미션 변경되었습니다.";

?>

'[ 충남인력개발원 ] (2019) > ┗TCP&IP' 카테고리의 다른 글

송수신 보기  (0) 2019.11.26
sendto() 소켓으로 데이터를 전송  (0) 2019.11.26
github.com 설정하기  (0) 2019.11.25
신기한 마이너스 나오는 것들  (0) 2019.11.25
복습  (0) 2019.11.25
블로그 이미지

Or71nH

,

 

https://github.com/Or71nH/TcpComm/blob/master/README.md

 

 

# TcpComm
TCP/IP Server and Client Program  on Ubuntu Linux

1. How to compile for server 

    $ gcc -o server server.c
    
2. How to compile for client

    $ gcc -o client client.c
    
3. Run the server 

    ./ server 9190
    
4. Run the client

    ./client 127.0.0. 9190

 

 

 

 

위에 변경되서  업데이트 해와야함 

 

mes@ubuntu:~/TcpComm$ git pull origin master

 

 

 

 

 

 

 

 

 

 

git

 

 

 

get_buf.c 받는넘 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
void error_handling(char *message);

int main(int argc, char *argv[])
{
	int sock;
	int snd_buf, rcv_buf, state;
	socklen_t len;
	
	sock=socket(PF_INET, SOCK_STREAM, 0);
	len=sizeof(snd_buf);
	state=getsockopt(sock, SOL_SOCKET, SO_SNDBUF, (void*)&snd_buf, &len);
	if(state)
		error_handling("getsockopt() error");

	len=sizeof(rcv_buf);
	state=getsockopt(sock, SOL_SOCKET, SO_RCVBUF, (void*)&rcv_buf, &len);
	if(state)
		error_handling("getsockopt() error");

	printf("Input buffer size: %d \n", rcv_buf);
	printf("Output buffer size: %d \n", snd_buf);
	return 0;
}

void error_handling(char *message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}

 

 

 

 

 

 

set_buf.c  보내는넘

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
void error_handling(char *message);

int main(int argc, char *argv[])
{
	int sock;
	int snd_buf=1024*3, rcv_buf=1024%3;
	int state;
	socklen_t len;

	sock=socket(PF_INET, SOCK_STREAM, 0);
	state=setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (void*)&rcv_buf, sizeof(rcv_buf));
	if(state)
		error_handling("setsockopt() error!");

	state=setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (void*)&snd_buf, sizeof(snd_buf));
	if(state)
		error_handling("setsockopt() error!");

	len=sizeof(snd_buf);
	state=getsockopt(sock, SOL_SOCKET, SO_SNDBUF, (void*)&snd_buf, &len);
	if(state)
		error_handling("getsockopt() error!");

	len=sizeof(rcv_buf);
	state=getsockopt(sock, SOL_SOCKET, SO_RCVBUF, (void*)&rcv_buf, &len);
	if(state)
		error_handling("getsockopt() error!");

	printf("Input buffer size: %d \n", rcv_buf);
	printf("Output buffer size: %d \n", snd_buf);
	return 0;
}

void error_handling(char *message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}

 

reuseadr_eserver.c 이거  재사용 하는거임 그런거임 ㅇㅇ

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define TRUE 1
#define FALSE 0
void error_handling(char *message);

int main(int argc, char *argv[])
{
	int serv_sock, clnt_sock;
	char message[30];
	int option, str_len;
	socklen_t optlen, clnt_adr_sz;
	struct sockaddr_in serv_adr, clnt_adr;
	if(argc!=2) {
		printf("Usage : %s <port>\n", argv[0]);
		exit(1);
	}
	
	serv_sock= socket(PF_INET, SOCK_STREAM, 0);
	if(serv_sock==-1)
		error_handling("socket() error");
	/*
	optlen=sizeof(option);
	option=TRUE;
	setsockopt(serv_sock, SOL_SOCKET, SO_REUSEADDR, (void*)&option, optlen);
	*/

	memset(&serv_adr, 0, sizeof(serv_adr));
	serv_adr.sin_family=AF_INET;
	serv_adr.sin_addr.s_addr=htonl(INADDR_ANY);
	serv_adr.sin_port=htons(atoi(argv[1]));

	if(bind(serv_sock, (struct sockaddr*)&clnt_adr, sizeof(serv_adr)))
		error_handling("bind() error");

	if(listen(serv_sock, 5)==-1)
		error_handling("listen() error");

	clnt_adr_sz=sizeof(clnt_adr);
	clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_adr,&clnt_adr_sz);

	while((str_len=read(clnt_sock,message, sizeof(message)))!= 0)
	{
		write(clnt_sock, message, str_len);
		write(1, message, str_len);
	}
	close(clnt_sock);
	close(serv_sock);
	return 0;
}

void error_handling(char *message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}
블로그 이미지

Or71nH

,