教材中涉及的一些C语言的简单例子

小布 3月前 153

所有的例子使用如下命令进行编译:

gcc -Wall xxx.c -o xxxx

这个例子演示malloc/free分配和释放私有内存的使用方法

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
	char* mem = (char*)malloc(8192); // system call
	if(NULL != mem) 
	{
		mem[0] = mem[1] = 'A'; mem[2] = 0x00;
		printf("mem is [%s]\n", mem);
		free(mem);
	}
	return 0;
}

 

这个例子演示fork()的使用

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main() 
{
    pid_t pid;

    // Create a new process
    pid = fork();

    if (pid < 0) 
	{
        // Error occurred
        perror("Fork failed");
        return 1;
    } else if (pid == 0) 
	{
        // Child process
        printf("Child Process: PID = %d, Parent PID = %d\n", getpid(), getppid());
    } else 
	{
        // Parent process
        printf("Parent Process: PID = %d, Child PID = %d\n", getpid(), pid);
    }

    return 0;
}

 

私有内存的演示:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define MEMORY_SIZE 8192

char* gmem = NULL;

int main(int argc, char* argv[])
{
	pid_t pid;
	int result = 0;

	gmem = (char*)malloc(MEMORY_SIZE);
	if(NULL == gmem) { result = 1; goto myquit; }

	gmem[0] = gmem[1] = 'A'; gmem[2] = 0x00;

	pid = fork(); 
	if(pid < 0) { result = 1; goto myquit; }
	if(0 == pid) 
	{ 
		printf("(Child): I will sleep for a while.\n");
		sleep(10); /* sleep for 10 seconds */
		printf("(Child): gmem is [%s]\n", gmem);
		goto myquit;
	} else 
	{ 
		gmem[0] = gmem[1] = 'B'; gmem[2] = 0x00;
		sleep(20); /* sleep for 20 seconds */
		printf("(Parent): gmem is [%s]\n", gmem);
	}
	
myquit:
	if(NULL != gmem) free(gmem);
	return result;
}

d

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>

#ifndef MAP_ANONYMOUS
#define MAP_ANONYMOUS MAP_ANON
#endif

#ifndef MAP_HASSEMAPHORE
#define MAP_HASSEMAPHORE 0
#endif

#define PG_MMAP_FLAGS (MAP_SHARED|MAP_ANONYMOUS|MAP_HASSEMAPHORE)
#define MEMORY_SIZE 8192

void* gmem = MAP_FAILED;

int main(int argc, char* argv[])
{
	pid_t pid;
	int result = 0;
	char *p;

	gmem=mmap(NULL,MEMORY_SIZE,PROT_READ|PROT_WRITE,PG_MMAP_FLAGS,-1,0);
	if(MAP_FAILED == gmem) { result = 1; goto myquit; }
	
	p = (char*)gmem; p[0] = p[1] = 'A'; p[2] = 0x00;
	
	pid = fork(); /* <---The key point!!! */
	
	if(pid < 0) { result = 1; goto myquit; }
	if(0 == pid) 
	{ /* fork succeeded, in child process */
		sleep(10);
		p = (char*)gmem; p[0] = p[1] = 'B'; p[2] = 0x00;
		exit(0);
	} else 
	{ /* fork succeeded, in parent process */
		printf("(Parent) - before sleep: [%s]\n", p);
		sleep(20);
		printf("(Parent) - after sleep: [%s]\n", p);
	}
myquit:
	if(MAP_FAILED != gmem) munmap(gmem, MEMORY_SIZE);
	return result;
}

 

write/read

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

char data_buf[16] = {0};

int main(int argc, char* argv[])
{
	int fd = open("data.bin", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);

	if (fd == -1) 
	{
		printf("Cannot open file\n");
		return 1;
	}
	
	for(int i=0; i<16; i++) data_buf[i]=i+1;
	
	ssize_t bytes_written = write(fd, data_buf, 16);
	if (bytes_written == -1) 
	{
		printf("Cannot write to file\n");
		close(fd);
		return 2;
	}
	close(fd);
	return 0;
}

最新回复 (0)
返回
发新帖