Linux基础知识、设置进程自启动、进程间通信

这篇博客介绍了Linux的基础知识,包括C语言main函数参数、fork()函数、system()与popen的区别、进程原子性、setsockopt()和getsockopt()函数。还讲解了Linux进程的exec族函数、setsid()、top命令、根据进程名杀进程、syslog日志输出及gdb调试。此外,讨论了systemd的service文件、进程间通信的四种方式(管道、共享内存、消息队列、套接字)以及Linux虚拟化的意义和添加用户及用户组的方法。
摘要由CSDN通过智能技术生成

Linux基础学习

https://www.runoob.com/linux/

C语言main函数参数含义

在C语言中,main函数的参数包括两个:argc和argv。其中,argc表示命令行参数的个数,而argv是一个指向字符串指针的数组,每个元素指向一个命令行参数字符串。比如:

#include <stdio.h>

int main(int argc, char *argv[]) {
   
    int i;
    for (i = 0; i < argc; i++) {
   
        printf("argv[%d]: %s\n", i, argv[i]);
    }
    return 0;
}

如果在命令行中输入了以下命令:

$ ./a.out hello world

那么程序的输出将会是:

argv[0]: ./a.out
argv[1]: hello
argv[2]: world

fork()函数返回值

调用fork()接口时:

  • 如果返回值是0,那么说明当前进程是子进程。
  • 如果返回值大于0,那么说明当前进程是父进程,返回值是子进程的PID。
  • 如果返回值小于0,则表示fork()调用失败。
/* fork_test.c */
#include<sys/types.h>
#inlcude<unistd.h>
main()
{
   
pid_t pid;
 
/*此时仅有一个进程*/
pid=fork();
/*此时已经有两个进程在同时运行*/
if(pid<0)
	printf("error in fork!");
else if(pid==0)
	printf("I am the child process, my process ID is %d/n",getpid());
else
	printf("I am the parent process, my process ID is %d/n",getpid());
}

system()和popen区别

https://zhuanlan.zhihu.com/p/457974696
1.阻塞进程
(1)是否跟system()一样?

答案:不一样。

(2)详述

前面的测试结果可见,popen调用到pclose调用之间的程序没有被阻塞,pclose后面的代码被阻塞了。所以popen不会阻塞调用者进程,但是pclose会阻塞,也就是说popen-pclose把system调用分开了,以便用户在popen后可以继续运行主进程。

2.返回值
(1)是否跟system()一样?

答案:不一样。

(2)详述

popen返回值很简单,要么非NULL,要么NULL。但是要注意,popen返回成功只代表管道创建成功,不能说明命令执行成功,命令执行结果需要通过pclose返回值来判断。

pclose返回值就跟system除开-1,1后一样。也不简单。

linux系统中对一个64位或者32的整型数据写操作是原子的吗

在Linux系统中,对于64位或32位整型数据的写操作是原子的。这意味着在一个线程写入整型数据时,另一个线程不会读到写入的部分数据。

具体来说,当一个线程写入一个整型数据时,操作系统会将该操作分解为多个CPU指令,每个指令都是原子的。这些指令会被CPU依次执行,直到整个操作完成。在这个过程中,其他线程无法读取到中间状态的数据

因此,如果一个线程正在写入一个整型数据,另一个线程在此期间读取该数据,它只能读取到原始值或者已经完成写入的新值,而不会读取到中间状态的数据。

但需要注意的是,对于多个线程同时写入同一个整型数据的情况,需要使用同步机制(如互斥锁、读写锁等)来保证数据的一致性和正确性。

setsockopt()和getsockopt()函数

https://blog.csdn.net/weixin_44498318/article/details/120007410
https://zhuanlan.zhihu.com/p/77023584
如果setsockopt()函数返回-1则表示出错,返回0表示成功。可以使用perror()函数或者strerror()来打印出错信息。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/socket.h>

int main(int argc, char *argv[]) {
   
    int sockfd;
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd == -1) {
   
        perror("socket");
        printf("socket fail, ERROR:%s", strerror(errno));
        exit(EXIT_FAILURE);
    }

    int optval = 1;
    if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR,
                   &optval, sizeof(optval)) == -1) {
   
        perror("setsockopt");
        printf("setsockopt fail, ERROR:%s", strerror(errno));
        exit
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值